2

私はエンティティ フレームワーク 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行の結果の statmenet に句がない理由がわかりquery.Any() ませんWHERE。どちらからのフィルターwherePredicatex.SpecialNeeds == 0適用されません。

何か案が?

更新 1: 問題wherePredicateは、式ではなく Func 型の にあるようです。エクスプレッションを使ってみます。

4

1 に答える 1

4

GetSuccessRateメソッド宣言を次のように変更してみてください

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

その理由は、Where内部に 2 つの拡張メソッドがあるためです: Enumerable.WhereandQueryable.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)

1 つは受信Func<TSource, bool>し、もう 1つは受信しますExpression<Func<TSource, bool>>

宣言を変更した後、.AsQueryable()呼び出しに違いはありません。

于 2013-05-17T09:19:01.303 に答える