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表达式中的扩展方法。您可以尝试集中您的条件并将其用作表达式树,例如:
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()
,以避免访问表的所有记录