我正在使用Entity framework 4,我有以下代码:
public decimal GetSchoolSuccessRate(EvaluationComparationFilter filter)
{
return this.GetSuccessRate(x => x.TestCampaignId == filter.TestCampaignId &&
x.SubjectId == filter.SubjectId &&
x.SectionNo == 0, filter.CountSvp);
}
private decimal GetSuccessRate(Func<FinalResult_Base, bool> wherePredicate, bool countSvp)
{
using (var db = new DataEntities())
{
IQueryable<FinalResult_Base> query = db
.FinalResult_Bases.Where(wherePredicate).AsQueryable();
if (!countSvp)
query = query.Where(x => x.SpecialNeeds == 0);
query.Any(); //--HERE is created the SELECT with NO WHERE clause
....
}
}
我不明白为什么行SELECT
的结果query.Any()
statmenet没有任何WHERE
子句。不会应用wherePredicate
和x.SpecialNeeds == 0
的过滤器。
有什么想法吗?
更新1:
问题似乎是wherePredicate
,其类型为Func not Expression。我将尝试使用Expression。
答案 0 :(得分:4)
尝试将GetSuccessRate
方法声明更改为
private decimal GetSuccessRate(
Expression<Func<FinalResult_Base, bool>> wherePredicate, bool countSvp)
原因是内部有两个Where
扩展方法:Enumerable.Where
和Queryable.Where
,它们有不同的声明:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate)
和
public static IQueryable<TSource> Where<TSource>(
this IQueryable<TSource> source,
Expression<Func<TSource, bool>> predicate)
因此,您会收到Func<TSource, bool>
和另一个Expression<Func<TSource, bool>>
更改声明后,.AsQueryable()
来电不会有任何区别。