我有一个方法可以从postgres中的序列返回值:

public long GetSId(DatabaseFacade d, string sequenceName)
{
    var result = new NpgsqlParameter(":result", NpgsqlDbType.Integer)
    {
        Direction = System.Data.ParameterDirection.InputOutput,
        Value = 0
    };
    d.ExecuteSqlRaw($"SELECT nextval('{sequenceName}')", result);
    return (long)result.Value;
}

我有一种形成数据的方法:

private List<CrossingsResult> FormCrossingResult()
{
    var d = _dbContext.Database;
    var crosswalks = _dbContext.Crosswalks
        .Select(x => new CrossingsResult
        {
            SId = GetSId(d, _sequenceName),
            ...
        }).ToList();
    return crosswalks;

问题是,当我在Select中调用方法时,SID不会改变(例如,它会为所有记录设置相同的SID值).但如果我在人行横道外调用该方法,它会起作用 就像这样:

private List<CrossingsResult> FormCrossingResult()
{
    var d = _dbContext.Database;
    Console.WriteLine($"First call: {GetSId(d, _sequenceName)}");
    Console.WriteLine($"Second call: {GetSId(d, _sequenceName)}");
    Console.WriteLine($"Third call: {GetSId(d, _sequenceName)}");
    var crosswalks = _dbContext.Crosswalks
        .Select(x => new CrossingsResult
        {
            SId = GetSId(d, _sequenceName),
            ...
        }).ToList();
    foreach (var crosswalk in crosswalks)
    {
        Console.WriteLine(crosswalk.SId);
    }
    return crosswalks;

Result be like this: Console output

我试着用for循环来做它,它起作用了:

private List<CrossingsResult> FormCrossingResult()
{
    var d = _dbContext.Database;
    var crosswalks = _dbContext.Crosswalks
        .Select(x => new CrossingsResult
        {
            ...
        }).ToList();
    foreach (var crosswalk in crosswalks)
    {
        crosswalk.SId = GetSId(d, _sequenceName);
    }
    return crosswalks;

但我希望调用Inside Select的方法不使用for循环

推荐答案

当我将人行横道转换为列表,然后使用SELECT方法时,它起作用了:

private List<CrossingsResult> FormCrossingResult()
{
    var d = _dbContext.Database;
    var crosswalks = _dbContext.Crosswalks
        .ToList() // here
        .Select(x => new CrossingsResult
        {
            SId = GetSId(d, _sequenceName),
            ...
        }).ToList();
    return crosswalks;
}

Csharp相关问答推荐

Monty Hall游戏节目模拟给我50/50的结果

C#相同名称的枚举方法和normal方法,参数类型不同

使用LINQ to XML获取元素值列表是不起作用的

如何在Visual Studio代码中更改大括号模式{},用于C#语言

XUNIT是否使用测试数据的源生成器?

C#XmlSerializer-输出控制新行的多个XML片段

需要在重新启动ApplicartionPool或IIS后启动/唤醒API的帮助

如何将不同类型的扩展参数的javascript函数转换成C#风格?

获取具有AutoFaces的所有IOptions对象的集合

如何在VS代码中为C#DotNet配置.json选项以调试内部终端的控制台应用程序

在C#中,非静态接口方法的抽象和虚拟是冗余的吗?

有没有类似于扩展元素的合并元组的语法?

将FileStream的特定部分作为字节数组读取

WPF动态设置弹出窗口水平偏移

匿名类型的AbstractValidator

C#无法将.csv列转换为用于JSON转换的列表

在C#和HttpClient中使用REST API

使用ITfoxtec.Identity.Saml2解析相同键多值SAML 2声明

将两个JSON文件与覆盖值的主文件合并

无法通过服务控制台启动.NET Core 6.0服务(错误1053)