c# - LINQ 到实体 : queryable extension method not reconized inside where condition

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

我正在使用带有代码优先 Entity Framework 的 asp.net 4.5 mvc 5 并遇到以下问题:

我有两个模型,“PostBody”和“PostHeader”。 1 个 PostHeader 有 1-n 个 PostBodies。 PostBody 可以被“删除”(属性作为标志)。

我的扩展方法应该给我来自 IQueryable 对象的每个 PostBody,它没有作为 IQueryable 被删除:

    public static IQueryable<TSource> GetActiveVersions<TSource>(this IQueryable<TSource> source)
       where TSource : PostBody
    {
        return source.Where(x => x.Deleted == false);
    }

当我做这样的事情时,它工作正常

var x = db.Bodies.GetActiveVersions().ToList();

或者这个

var y = db.Headers.FirstOrDefault().Bodies.AsQueryable().GetActiveVersions().ToList();

等- 但是一旦我使用我的扩展方法作为表达式参数的一部分,例如where 方法,我遇到了 NotSupportedException:

var z = db.Headers.Where(h => h.Bodies.AsQueryable().GetActiveVersions().Count() > 0).ToList();

System.NotSupportedException: LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[WebApplication5.Models.PostBody] GetActiveVersions[PostBody](System.Linq.IQueryable`1[WebApplication5.Models.PostBody])' method, and this method cannot be translated into a store expression.

我做错了什么?或者 - 我如何在 where 条件下使用我的扩展方法?

最佳答案

可能解析器无法解析 linq 表达式中的扩展方法。您可以尝试集中您的条件并将其用作表达式树,例如:

public static Expression<Func<TSource, bool>> GetActiveVersions()
    where TSource : PostBody
{
  return x => x.Deleted == false;
}

并在您的子查询(使用 linq)中应用此表达式作为示例:

var z = db.Headers.Where(h => h.Bodies.AsQueryable().Any(GetActiveVersions())).ToList();

而不是使用 Count() > 0,更喜欢使用 .Any() 来避免访问表的所有记录。

关于c# - LINQ 到实体 : queryable extension method not reconized inside where condition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32279985/

相关文章:

asp.net - 是否可以使 Page.IsPostBack 独立于 ASP.net 为真?

asp.net - 如何使用javascript从单选按钮列表中查找所选项目

linq - 如何将 DataTable 转换为 IEnumerable<Dictionary<string, object>>?

c# - 为什么 LINQ SelectMany 忽略包含? (实际上删除了加载的数据)

c# - 如何在 Office 2010 插件中以编程方式导航?

c# - C#中使用is关键字声明变量内联

c# - 垃圾收集如何决定变量的生成

c# - 如何使用 FindChessboardCorners

c# - ASP.Net MVC 4 自定义 ValidationAttribute 依赖注入(inject)

c# - 动态查询 2 个实体类型并将结果映射回特定实体集