2017-06-29 9 views
0

私はこれを今日何時間も作業してきましたが、これを行う簡単な方法があるように感じていますが、それは何となくbrute forceで動作させることはできません。ラムダクエリの複数の独立したフィルタ

私は5つのフィルタに基づいて、2つのオブジェクト間のマッピングとして機能するアプリケーション内のエンティティを持っています。目標は、フィルタと最も一致するレコードを見つけることです。

今、私は手作業でブルートゥースを使って最も特定の行を取得するために2^5のクエリを強制しますが、これを行うにははるかに簡単な方法が必要だと感じます。

ここで唯一の問題は、データベースに特定のフィルタ(またはすべて)の一致がないことがあり、その場合はNULLレコードを選択したいということです。

以下は私の恥ずかしそうなブルー​​トフォースクエリの抜粋です。まず、5つのフィルタすべてを試してから、4つのマッチング、次に3つ、2つ、1つ、最後にすべてのNullの順列を試したいと思います。

incList.FirstOrDefault(x => 
       x.Filter1 == filter1Parameter && x.Filter2 == filter2Parameter && x.Filter3 == filter3Parameter && x.Filter4 == filter4Parameter && x.Filter5 == filter5Parameter 
       || x.Filter1 == null && x.Filter2 == filter2Parameter && x.Filter3 == filter3Parameter && x.Filter4 == filter4Parameter && x.Filter5 == filter5Parameter 
       || x.Filter1 == filter1Parameter && x.Filter2 == null && x.Filter3 == filter3Parameter && x.Filter4 == filter4Parameter && x.Filter5 == filter5Parameter 
       || x.Filter1 == filter1Parameter && x.Filter2 == filter2Parameter && x.Filter3 == null && x.Filter4 == filter4Parameter && x.Filter5 == filter5Parameter 
       || x.Filter1 == filter1Parameter && x.Filter2 == filter2Parameter && x.Filter3 == filter3Parameter && x.Filter4 == null && x.Filter5 == filter5Parameter 
       || x.Filter1 == filter1Parameter && x.Filter2 == filter2Parameter && x.Filter3 == filter3Parameter && x.Filter4 == filter4Parameter && x.Filter5 == null 

私はもともと、私はそれが動作しませんでしたではない

    incList.FirstOrDefault(x => (x.Filter1 == filter1Parameter || x.Filter1 == null) && 
            (x.Filter2 == filter2Parameter || x.Filter2 == null) && 
            (x.Filter3 == filter3Parameter || x.Filter3 == null) && 
            (x.Filter4 == filter4Parameter || x.Filter4 == null) && 
            (x.Filter5 == filter5Parameter || x.Filter5 == null)); 

しかし場合は独立して存在した場合に値を取得し、nullをつかむだろう簡単な文を持っていると考えていました。

何か指摘していただければ幸いです。

+0

を項目を選択することができますが、「しかし、それは動作しませんでした」について詳しく説明することはできますか?また、この例では、5つではなく2つまたは3つのフィルタを使用するほうがずっと読みやすくなります。 –

答えて

0

私はまだ要件の完全な範囲を理解しようとしています。

ただし、このFuncまたはFuncを別のクラスで抽象化することを検討しましたか。この1つまたは複数のクラスは、戦略のように動作します。特定の述語に基づいてコレクションをフィルタリングするものだけを担当します。

もしそれが良いルートのように見えないなら、あなた自身の実装IEqualityComparerを書いてみることはどうでしょうか?これにより、これらのオブジェクトをどのように等しくするかを決定できます。

0

あなたは「適応度関数」のようなものを導入して、最大適合値で

var bestMatch = incList.Select(x => new 
{ 
    item = x, 
    fit = 
     (x.Filter1 == null 
      ? 1 
      : (x.Filter1 == filter1Parameter ? 2 : 0)) * 
     (x.Filter2 == null 
      ? 1 
      : (x.Filter2 == filter2Parameter ? 2 : 0)) // and so on 
}) 
.OrderByDescending(x => x.fit) 
.FirstOrDefault(x => x.fit > 0)?.item; 
関連する問題