1. ホーム
  2. linq

[解決済み] Linq:where節に条件を条件付きで追加する

2022-09-08 05:15:38

質問

次のようなクエリを持っています。

(from u in DataContext.Users
       where u.Division == strUserDiv 
       && u.Age > 18
       && u.Height > strHeightinFeet  
       select new DTO_UserMaster
       {
         Prop1 = u.Name,
       }).ToList();

年齢や身長などの様々な条件を、このクエリを実行するメソッドに提供されたかどうかに基づいて追加したいのです。すべての条件には、ユーザー部門が含まれます。年齢が提供された場合、それをクエリに追加したいと思います。同様に、もし身長が提供されたなら、それも追加したい。

もしこれがSQLクエリを使って行われるのであれば、メインのstrSQLクエリに追加するためにストリングビルダーを使用したことでしょう。しかし、ここでの Linq では、同じクエリを 3 回書き、各 IF ブロックが追加の条件を持つような IF 条件を使用することしか考えられません。これを行うためのより良い方法はありますか?

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

を呼び出さない場合 ToList() と DTO タイプへの最終的なマッピングを追加することができます。 Where 節を追加していき、最後に結果を構築します。

var query = from u in DataContext.Users
   where u.Division == strUserDiv 
   && u.Age > 18
   && u.Height > strHeightinFeet
   select u;

if (useAge)
   query = query.Where(u => u.Age > age);

if (useHeight)
   query = query.Where(u => u.Height > strHeightinFeet);

// Build the results at the end
var results = query.Select(u => new DTO_UserMaster
   {
     Prop1 = u.Name,
   }).ToList();

これでもデータベースへの呼び出しは1回だけで、実質的にはクエリを1回で書いたのと同じような効率になります。