3

Expression<Func<User, bool>>次のようなタイプのオブジェクトとして仕様を定義しました。

public static Expression<Func<User, bool>> IsSystemUser
{
  get
  {
    return user => user.UserID == -1;
  }
}

これは、拡張メソッド構文で記述されたクエリで驚くほど機能します。

return workspace.GetDataSource<User>().Where(UserSpecifications.IsSystemUser);

しかし、Linq クエリ構文ではそうではありません:

return from user in workspace.GetDataSource<User>() where UserSpecifications.IsSystemUser select user;

コンパイラは私に与えますcannot implicitly convert type 'Expression<Func<User, bool>>' to 'bool'

何を与える?私は、Linq クエリ構文は、拡張メソッド構文をドレスアップしたかわいい DSL だと思っていました。私の素敵な仕様をLinqクエリ構文でどのように使用できるか誰か教えてもらえますか?

4

1 に答える 1

2

クエリ式は次のように変換されています:

return workspace.GetDataSource<User>()
                .Where(user => UserSpecifications.IsSystemUser);

ラムダ式は暗黙的に導入されますが、この場合は必要ありません。したがって、クエリ式の構文は使用しないでください...ここでクエリ式の構文が拡張メソッドを直接使用するよりも長く、より多くの粗雑さを導入することを考えると、なぜそれが必要なのですか?

次のように組み合わせることができることに注意してください。

return from user in workspace.GetDataSource<User>()
                             .Where(UserSpecifications.IsSystemUser)
       where user.Name == "Bob"
       orderby user.ID
       select user;
于 2011-11-07T13:31:57.560 に答える