5

我试图从 RedGate ftp://support.red-gate.com/ebooks/under-the-hood-of-net-memory-management-part1.pdf的这本免费电子书中了解 Linq 的一些性能影响

在本书的第 157-158 页,他们创建了以下示例。

Order[] pastDueAccounts = null;  
DateTimedueDate = DateTime.Today.AddDays(-7);  
using(varcontext = new Context())    
{  
    pastDueAccounts = context.Accounts.Where(account => account.DueDate < dueDate).ToArray();  
} 

然后他们将 lamda 表达式的一部分重新分解为以下函数。

public bool PastDueAccount(Account account)  
{  
    return account.DueDate < DateTime.Today.AddDays(-7);  
} 

最后他们使用这个函数如下。

Order[] pastDueAccounts = null;  
using(varcontext = new Context())  
{  
    pastDueAccounts = context.Accounts.Where(account => PastDueAccount(account)).ToArray();  
} 

根据我到目前为止的研究,无法运行此 linq 查询,因为 LINQ 无法识别该方法并且无法转换为存储表达式。我想知道这个示例是否错误并且根本无法运行,或者我只是很难听到有关如何模拟这个问题的消息?

4

2 回答 2

8

你是对的,LINQ-to-Entities 不能以它的显示方式调用它。

它可以在 LINQ-to-Entities 中使用的唯一方法是:

于 2012-10-15T20:10:28.463 回答
3

正如 casperOne 所说,你不能用函数来做到这一点。这个答案是一种做你需要做的事情的方法(重用 where 过滤器)。

您可以创建一个Expression可以访问的地方,然后重复使用它。

System.Linq.Expressions.Expression<Func<Account, bool>> pastDueAccountFunc = account => account.DueDate < System.Data.Objects.EntityFunctions.AddDays(DateTime.Now, -7);

然后在以后使用它:

var pastDueAccounts = context.Accounts.Where(pastDueAccountFunc);

这是我使用的完整代码:

System.Linq.Expressions.Expression<Func<SomeNeatEntity, bool>> func = x => x.DateCreated < System.Data.Objects.EntityFunctions.AddDays(DateTime.Now, -7);

var entities = new MyEntities();

var t = entities.SomeNeatEntities.Where(func);
Console.WriteLine(t.Count());

var h = entities.SomeNeatEntities.Where(x => x.SomeField != null).Where(func);
Console.WriteLine(h.Count());

MyEntitiesObjectContext在项目中。
entities.SomeNeatEntitiesObjectSet<SomeNeatEntity>

于 2012-10-15T20:09:50.920 回答