我试图从RedGate的这本免费电子书中了解Linq的一些性能含义 ftp://support.red-gate.com/ebooks/under-the-hood-of-net-memory-management-part1.pdf
在本书的第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无法识别该方法,也无法转换为存储表达式。我想知道这个例子是不是错了,根本无法运行,或者我是否只是很难听到如何模拟这个问题?
答案 0 :(得分:8)
你是对的,LINQ-to-Entities无法按照它的显示方式调用它。
它可以在LINQ-to-Entities中使用的唯一方法是:
答案 1 :(得分: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());
MyEntities
是项目中的ObjectContext
entities.SomeNeatEntities
为ObjectSet<SomeNeatEntity>
。