我正在使用带有代码第一实体框架的asp.net 4.5 mvc 5并且存在以下问题:
我有两个型号," PostBody"和" PostHeader"。 1 PostHeader有1-n PostBodies。 PostBody可以被删除" (财产为国旗)。
我的扩展方法应该从IQueryable-Object给我每个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条件下使用我的扩展方法?
答案 0 :(得分:1)
也许解析器无法解析linq表达式中的扩展方法。您可以尝试集中您的条件并将其用作表达式树,样本:
absDiffDeg = min(360-normDeg, normDeg);
在你的子查询(使用linq)中将此表达式应用于样本:
public static Expression<Func<TSource, bool>> GetActiveVersions()
where TSource : PostBody
{
return x => x.Deleted == false;
}
而是使用var z = db.Headers.Where(h => h.Bodies.AsQueryable().Any(GetActiveVersions())).ToList();
,而不是使用Count() > 0
来避免访问表格的所有记录。