以下为什么IQueryable跟随Any导致选择没有Where子句?

时间:2013-05-17 08:54:09

标签: c# .net sql entity-framework lambda

我正在使用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子句。不会应用wherePredicatex.SpecialNeeds == 0的过滤器。

有什么想法吗?

更新1: 问题似乎是wherePredicate,其类型为Func not Expression。我将尝试使用Expression。

1 个答案:

答案 0 :(得分:4)

尝试将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()来电不会有任何区别。