在LINQ中使用函数

时间:2012-09-06 14:57:13

标签: 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 = (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;
}

2 个答案:

答案 0 :(得分:7)

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

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));

答案 1 :(得分:0)

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);

但如果它在很大程度上依赖于数据库中没有的内容,我只需在获得WashroomStatus之前结束Linq语句,然后在结果上调用GetWashroomStatusForItem()。由于Linq使用延迟评估,因此通常希望将数据库操作与“程序化”操作分开,这不会产生性能差异。