是否可以在调用Where的地方调用named方法?

时间:2012-10-15 20:04:20

标签: c# .net linq entity-framework-4 linq-to-entities

我试图从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无法识别该方法,也无法转换为存储表达式。我想知道这个例子是不是错了,根本无法运行,或者我是否只是很难听到如何模拟这个问题?

2 个答案:

答案 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.SomeNeatEntitiesObjectSet<SomeNeatEntity>