ホームページ > バックエンド開発 > C++ > 動的 LINQ WHERE 句で OR ロジックを効率的に実装するにはどうすればよいですか?

動的 LINQ WHERE 句で OR ロジックを効率的に実装するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-22 05:06:09
オリジナル
591 人が閲覧しました

How Can I Efficiently Implement OR Logic in a Dynamic LINQ WHERE Clause?

LINQKit を使用して動的 WHERE 句の OR ロジックを強化します

前の記事では、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート