Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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#_.net_Linq - Fatal编程技术网

C# 在LINQ中使用函数

C# 在LINQ中使用函数,c#,.net,linq,C#,.net,Linq,我正在使用LINQ创建一个列表。但是我想在最后使用一个函数来生成对象iself,这是LINQ抱怨的 LINQ to Entities does not recognize the method 'WashroomStatusItem GetWashroomStatusForItem(WashroomStatus)' method, and this method cannot be translated into a store expression. 我做错了什么 var query = (

我正在使用LINQ创建一个列表。但是我想在最后使用一个函数来生成对象iself,这是LINQ抱怨的

LINQ to Entities does not recognize the method 'WashroomStatusItem GetWashroomStatusForItem(WashroomStatus)' method, and this method cannot be translated into a store expression.
我做错了什么

var query = (from c in context.WashroomStatus
    where c.WashroomId == GroupItem.WashroomID
    select GetWashroomStatusForItem(c));

private WashroomStatusItem GetWashroomStatusForItem(WashroomStatus item)
{
    WashroomStatusItem temp = new WashroomMonitorWCF.WashroomStatusItem();
    //do stuff with it
    return temp;
}

问题是SQL转换无法将您的方法转换为SQL。您应该使用AsEnumerable从进程外提供程序切换到LINQ to对象。例如:

var query = context.WashroomStatus
                   .Where(c => c.WashroomId == GroupItem.WashroomID)
                   .AsEnumerable()
                   .Select(c => GetWashroomStatusForItem(c));
请注意,如果GetWashroomStatusForItem仅使用某些属性,您可能希望首先分别投影到这些属性,以减少从服务器获取的信息量:

var query = context.WashroomStatus
                   .Where(c => c.WashroomId == GroupItem.WashroomID)
                   .Select(c => new { c.Location, c.Date };
                   .AsEnumerable()
                   .Select(p => GetWashroomStatusForItem(p.Location, p.Date));

Jon Skeet的回答是正确的,但我要补充的是,根据GetWashroomStatusForItem的性质,它可能应该分解为LINQ语句并添加到查询本身中,或者应该在查询返回后执行

所以,假设GetWashroomStatusForItem看起来是这样的:注意,这是非常简单的

public static WashroomStatus GetWashroomStatusForItem(Item c)
{
    return c.WashroomStatus;
}
它应该像这样添加到LINQ查询中:

var query = (from c in context.WashroomStatus
    where c.WashroomId == GroupItem.WashroomID
    select c.WashroomStatus);

但是,如果它严重依赖于数据库中没有的内容,我会在获得洗手间状态之前结束Linq语句,然后在结果上调用GetWashroomStatusForItem。因为Linq使用延迟计算,所以不会有性能差异,而且您通常希望将db操作与编程操作分开

你收到的错误是什么LINQ抱怨的东西太模糊了。请以后再详细说明。