LINQ到实体:在where条件中无法识别可查询扩展方法

本文关键字:识别 查询 方法 扩展 实体 条件 where LINQ | 更新日期: 2023-09-27 18:10:27

我正在使用asp.net 4.5 MVC 5与代码第一实体框架,并有以下问题:

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

我的扩展方法应该给我每个PostBody从一个IQueryable- object不删除作为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到实体:在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(),以避免访问表的所有记录