1. ホーム
  2. c#

[解決済み] LINQ拡張メソッドによる複数のWHERE句の作成

2023-05-13 09:57:39

質問

以下のようなLINQクエリを持っています。

DateTime today = DateTime.UtcNow;
var results = from order in context.Orders
              where ((order.OrderDate <= today) && (today <= order.OrderDate))
              select order;

私はLINQを学び、理解しようとしています。場合によっては、私は2つの追加のWHERE句を追加する必要があります。これを行うための努力として、私は使用しています。

if (useAdditionalClauses)
{
  results = results.Where(o => o.OrderStatus == OrderStatus.Open)  // Now I'm stuck.
}

ご覧の通り、WHERE句を追加する方法は分かっています。しかし、複数の句を追加するにはどうしたらよいのでしょうか?例えば、私は

WHERE o.OrderStatus == OrderStatus.Open AND o.CustomerID == customerID

を前のクエリに追加します。拡張メソッドを使用してこれを行うにはどうすればよいですか?

ありがとうございます。

どのように解決するのですか?

2つの方法があります。

results = results.Where(o => (o.OrderStatus == OrderStatus.Open) &&
                             (o.CustomerID == customerID));

または

results = results.Where(o => (o.OrderStatus == OrderStatus.Open))
                 .Where(o => (o.CustomerID == customerID));

私は通常、後者を好みます。 しかし、SQLサーバーをプロファイリングしてクエリの実行を確認し、データに対してどちらがより良いパフォーマンスを示すか(もし違いがあれば)確認する価値はあります。

を連鎖させることについてのメモです。 .Where() メソッドを連結することについての注意点です。 LINQのメソッドはすべて連鎖させることができます。 のようなメソッドは .Where() のようなメソッドは、実際にはデータベースに対して実行されません(まだ)。 それらは 実行を延期する のように)実際の結果が計算されるまで、実行を延期します。 .Count() または .ToList() ). そのため、複数のメソッドを連鎖させると(より多くの呼び出しを .Where() への呼び出しが増える)、もしかしたら .OrderBy() など) を構築し、いわゆる 表現ツリー . このツリー全体が、評価するときにデータ ソースに対して実行されるものです。