为什么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子句。wherePredicatex.SpecialNeeds == 0的过滤器都不应用。

任何想法?

更新1:问题似乎是wherePredicate,这是类型的函数不是表达式。我将尝试使用Expression.

为什么Any后面的AsQueryable会导致没有Where类的选择

尝试将GetSuccessRate方法声明更改为

private decimal GetSuccessRate(
    Expression<Func<FinalResult_Base, bool>> wherePredicate, bool countSvp)

原因是里面有两个Where扩展方法:Enumerable.WhereQueryable.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()调用将不会产生任何差异。