0

我正在使用 LINQ 创建一个列表。但是我想在最后使用一个函数来自己生成对象,这是 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;
}
4

2 回答 2

7

问题是 SQL 转换无法将您的方法转换为 SQL。您应该使用AsEnumerable()从进程外提供程序“切换”到 LINQ to 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));
于 2012-09-06T14:59:47.497 回答
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);

但如果它严重依赖数据库中没有的东西,我会在你得到之前结束 Linq 语句WashroomStatus,然后调用GetWashroomStatusForItem()结果。由于 Linq 使用惰性求值,因此不会产生性能差异,并且您通常希望将数据库操作与“编程”操作分开。

于 2012-09-06T15:23:31.643 回答