为什么Any后面的AsQueryable会导致没有Where类的选择
本文关键字:Where 选择 Any AsQueryable 为什么 | 更新日期: 2023-09-27 18:13:57
我正在使用实体框架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
....
}
}
我不明白为什么query.Any()
行的SELECT
语句没有任何WHERE
子句。wherePredicate
和x.SpecialNeeds == 0
的过滤器都不应用。
任何想法?
更新1:问题似乎是wherePredicate
,这是类型的函数不是表达式。我将尝试使用Expression.
尝试将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()
调用将不会产生任何差异。