C# Can';t将扩展方法转换为存储表达式

C# Can';t将扩展方法转换为存储表达式,c#,entity-framework,linq-to-entities,entity-framework-4.1,extension-methods,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 En

我有如下扩展方法:

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
是跨域使用的现有方法,我希望重复使用该功能,而不是复制它


有什么想法吗?

LINQ to Entities引擎无法知道静态方法的功能。
LINQ查询只能从表达式树进行转换。

将其更改为:

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

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

。你有什么建议?复制功能?有没有什么方法可以让我在不重复的情况下使用这个方法?不幸的是,我不知道。你可以创建一个函数返回一个<代码>表达式,但是你不能编写它。是的,我正试图使方法返回谓词,但是我原来的查询也有一个或语句,这使得它很难。e、 g:
其中(x=>x.Something | | x.SatisfiesSomeCondition(someObj))
。因此,我必须将整个
Where
条件合并到方法中。将研究predicatebuilder。也无法使其与predicatebuilder一起工作,同样的问题。接受这个答案。作为记录,我最终复制了过滤逻辑。但是我不能使用OR运算符,对吗?请参阅我的评论以获得答案。不,您不能使用或操作。扩展方法不会为在单个条件下组合表达式提供可扩展性。
var query = ctx.Posts.SatisfiesSomeCondition(someObj)).ToList();