前の記事では、LINQ 遅延実行を使用して動的クエリを構築する方法を紹介しました。ただし、このクエリでは AND 条件を使用して WHERE 句を結合します。この記事では、代わりに OR ロジックを使用するようにこのメソッドを適応させる方法について説明します。
具体的な目標は、ユーザー名、Windows ユーザー名、またはその両方 (提供された IdentifierType 列挙によって決定) に基づいてユーザーを検索するクエリを作成することです。変更された GetUser メソッドは次のとおりです:
<code>public User GetUser(IdentifierType type, string identifier) { using (var context = contextFactory.Invoke()) { var query = from u in context.Users select u; var pred = Predicate.False<User>(); if (type.HasFlag(IdentifierType.Username)) pred = pred.Or(u => u.Username == identifier); if (type.HasFlag(IdentifierType.Windows)) pred = pred.Or(u => u.WindowsUsername == identifier); return query.Where(pred.Expand()).FirstOrDefault(); // 或者 return query.AsExpandable().Where(pred).FirstOrDefault(); } }</code>
OR ロジックを実装する鍵は、LINQKit ライブラリの PredicateBuilder にあります。これにより、動的な述語の構築が可能になり、Entity Framework と組み合わせて使用できます。述語は Predicate.False で始まり、IdentifierType フラグに基づいて動的に変更されます。
Entity Framework は式の呼び出しをサポートしていないため、Expand() メソッドは重要です。 AsExpandable() は、LINQKit の式アクセサーをアクティブ化し、式を Entity Framework が処理できる形式に変換します。これがないと、「Invoke」例外が発生します。
もう 1 つのアプローチは、Pete Montgomery の述語ビルダーを使用することです。これは、Expand() を必要とせずに同じ機能を実行します。
以上が動的 LINQ WHERE 句で OR ロジックを効率的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。