无法将扩展方法转换为存储表达式

时间:2012-01-31 05:48:30

标签: c# entity-framework linq-to-entities entity-framework-4.1 extension-methods

我有一个扩展方法如下:

public static bool SatisfiesSomeCondition(this Post post, SomeObj someObj)
{
   return post.SomeObjId == someObj.SomeObjId;
}

我正试图像这样使用它:

var query = ctx.Posts.Where(p => p.SatisfiesSomeCondition(someObj)).ToList();

但我得到错误:

  

LINQ to Entities无法识别方法'Boolean SatisfiesSomeCondition(xx.xx.xx.Post,xx.xx.xx.SomeObj)'方法,并且此方法无法转换为商店表达式。

如果我将查询更改为:

var query = ctx.Posts.Where(p => p.SomeObjId == someObj.SomeObjId).ToList();

这与方法相同。

它工作正常,并执行预期的T-SQL。

为什么我的第一个查询不起作用?这是一个静态方法,不能弄清楚如何创建表达式树? (例如WHERE过滤器)。当然,我不必首先实现查询? (这意味着我不希望通过网络回来的记录,我在这里进行分页/排序,所以这不是一个选项)。

当然,我可以继续使用有效的方法(例如上面的内容),但方法SatisfiesSomeCondition是跨域使用的现有方法,我想重用该功能,而不是重复它。< / p>

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

将其更改为:

public static IQueryable<Post> SatisfiesSomeCondition(this IQueryable<Post> query, SomeObj someObj)
{
   int id = someObj.SomeObjId;
   return query.Where(post => post.SomeObjId == id);
}

并使用它:

var query = ctx.Posts.SatisfiesSomeCondition(someObj)).ToList();

这样它应该有效。您可以在单个查询中组合多个Where条件,因此它应该为您提供至少基本的可重用性。

答案 1 :(得分:1)

LINQ to Entities引擎无法知道静态方法的作用 LINQ查询只能从表达式树中翻译。