Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用某些方法进行额外计算的LINQ查询_C#_Asp.net_Linq_Lambda - Fatal编程技术网

C# 调用某些方法进行额外计算的LINQ查询

C# 调用某些方法进行额外计算的LINQ查询,c#,asp.net,linq,lambda,C#,Asp.net,Linq,Lambda,我有一个linq查询,它需要在一个id上分组,以对包含2个状态值的行进行计数,然后我想调用一个方法,对结果计数执行计算。也许有人能帮我找到更好的方法。当我运行这个程序时,我看到一个异常,linq无法识别“calcRate”,但我以前也做过类似的事情,效果很好。我可能也没有正确地处理这个问题: var query = from c in (context.table .Where(s => s.date >= startDate && s.date <=

我有一个linq查询,它需要在一个id上分组,以对包含2个状态值的行进行计数,然后我想调用一个方法,对结果计数执行计算。也许有人能帮我找到更好的方法。当我运行这个程序时,我看到一个异常,linq无法识别“calcRate”,但我以前也做过类似的事情,效果很好。我可能也没有正确地处理这个问题:

var query = from c in (context.table
    .Where(s => s.date >= startDate && s.date <= endDate)
    .GroupBy(s => new { s.id })
    .Select(s => new
        {
            id = h.Key.id,
            rate = calcRate(h.Count(s=>s.status == 1), h.Count(s=>s.status != 3))
        }).ToList())
        select new { id = c.id, rate = c.rate };
var query=from c in(context.table
.Where(s=>s.date>=startDate&&s.datenew{s.id})
。选择(s=>new
{
id=h.Key.id,
速率=计算箱(h.Count(s=>s.status==1),h.Count(s=>s.status!=3))
}).ToList())
选择新{id=c.id,rate=c.rate};

您的linq是正确的,但是.ToList()之前的部分linq查询正在由EF转换为SQL,并且它不知道如何将calcRate转换为SQL,您必须在从SQL获取所有值后执行calcRate

您应该完成DB在DB中可以完成的部分,然后使用
.AsEnumerable()
将结果带回.NET以完成计算

var query = context.table
    .Where(s => s.date >= startDate && s.date <= endDate)
    .GroupBy(s => s.id)
    .Select(s => new
        {
            id = s.Key,
            rateArg1 = s.Count(s=>s.status == 1),
            rateArg2 = s.Count(s=>s.status != 3)
        })
    .AsEnumerable()
    .Select(s => new { s.id, rate = calcRate(s.rateArg1, s.rateArg2)});
var query=context.table
。其中(s=>s.date>=startDate和s.date s.id)
。选择(s=>new
{
id=s.键,
rateArg1=s.Count(s=>s.status==1),
rateArg2=s.Count(s=>s.status!=3)
})
.可计算的()
.Select(s=>new{s.id,rate=calcRate(s.rateArg1,s.rateArg2)});

除非您正在进行聚合(求和、分组…),否则请使用linq to sql查询数据库,当您手头有数据时,请使用业务层中的linq to对象来处理您的对象。谢谢您的建议。Gabe您上面的代码解决了一个问题,并创建了另一个问题,为此我需要做一些其他工作。还有很多东西要学!