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

标签 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 does not recognize the method 'Boolean SatisfiesSomeCondition(xx.xx.xx.Post, xx.xx.xx.SomeObj)' method, and this method cannot be translated into a store expression.

如果我将查询更改为:

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

与方法相同。

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

为什么我的第一个查询不起作用?这是一个静态方法,它不能弄清楚如何创建表达式树吗? (例如 WHERE 过滤器)。我当然不必首先具体化查询吗? (这意味着我不想通过网络返回记录,并且我正在此处进行分页/排序,因此这不是一个选项)。

当然,我可以选择有效的方法(例如上面的方法),但是方法 SatisfiesSomeCondition 是跨域使用的现有方法,我想重用该功能,而不是重复它。

有什么想法吗?

最佳答案

将其更改为:

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 条件,这样它至少应该为您提供基本的可重用性。

关于c# - 无法将扩展方法转换为存储表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9075021/

相关文章:

c# - ASP.NET MVC OutputCache 不存储自定义 header

c# - HttpResponseMessage 在使用 HttpClient 时缺少 header ,但 fiddler 找到了

c# - 使用LINQ从表的10个字段中选择3个字段

entity-framework - Entity Framework 和 LINQ To SQL - 利益冲突?

c# - 足球模拟中的工作阵型算法

c# - Entity Framework : Store entity property in json format

c# - EF LINQ ToList 非常慢

c# - 当值更改时 WPF 组合框不会更新

c# - 使用 Entity Framework 提高效率

linq - 如果使用 LINQ to SP 和 Sp 返回多个记录集,DBML 中缺少模式