0

これは機能します:

var user = db.Users.OrderByDescending(u => u.Id).FirstOrDefault(u => u.Email == "asd@gmail.com" && u.Password == "8a79hjhfas8d7fd89");

1 人のユーザーのみを返す sql ステートメントが正しく生成されます。

理論的には同じである以下のコードは、データベースからすべてのユーザーを取得し、その後にのみフィルターを適用します。.ToList() を実行しているかのように機能するため、データベースからすべてを評価し、正しい SQL ステートメントを生成する代わりに、通常の IEnumerable でフィルターを適用します。

public static User Get(Func<User, bool> predicate)
{
  return db.Users.OrderByDescending(u => u.Id).FirstOrDefault(predicate);
}

var user = User.Get(u => u.Email == "asd@gmail.com" && u.Password == "8a79hjhfas8d7fd89");

これは Entity Framework のバグですか、それとも何か不足していますか?

4

2 に答える 2

1

Func<>コンパイルされたデリゲートであるを渡しています。Expression<>代わりに、各結果に対してデリゲート メソッドを実行する代わりに、EF が分析してクエリを生成できる構文ツリーである Get パラメーターとして渡す必要があります。

于 2012-05-17T12:40:49.270 に答える
0

EF は、任意の Func デリゲートを SQL に変換する方法を知らないため、データセット全体をロードしてから、その結果セットで述語を実行するしかありません。

于 2012-05-17T12:42:40.290 に答える