0

私のデータアクセスクラスの1つでEntity Framework 4.3を使用すると、このような汎用関数があります

    public List<Company> Query(Func<Company, bool> expression)
    {
        return MyDbContext.Instance().Company.Where(expression).ToList();
    }

ビジネス層クラスから MyDAL.Query(a => a.Name.Contains(textToSearch)) として使用します。

ofEntity Framework は正しい結果を返すのに、なぜ "Where name like '%' + textToSearch + '%'" のような Where 句を含む SQL クエリ文を生成するのではなく、where のない SQL クエリ文を生成するのかわかりません。句は、すべてのテーブル行を照会します。明らかに、これは非常に非効率的です。

他の方法で、私のデータ アクセス クラスでは、次のようなメソッドを記述します。

    public List<Company> GetLikeName(string textToSearch)
    {
        return MyDbContext.Instance().Company.Where(a => a.Contains(textToSearch)).ToList();
    }

where like句を使用してSqlを正しく生成します。

一般的なクエリを使用してデータベースから結果を取得し、ビジネス クラスからクエリする式を指定すると、where 句のない SQL 文が生成されるのはなぜですか?

ありがとう

4

1 に答える 1

4

式パラメーターを次のように渡す必要がありますExpression<>

public List<Company> Query(Expression<Func<Company, bool>> expression)

を単に渡すとFunc<>IEnumerable.Where代わりに が呼び出されIQueryable.Where、SQL ではなくコードで実行されます。

于 2012-05-07T19:34:47.510 に答える