1

注:すべてのコードは頭のてっぺんに書かれています。多少の誤差が含まれる場合があります。この質問の全体的なポイントを取得するだけです)

このクラス定義を取る: (簡単にするために削減)

public class CodedValue
{
  public string Code { get; set; }
  public string Value {get; set; }
}

それらのオブジェクトを取る:

CodedValue cv1 = new CodedValue(){ Code = "A",  Value = "1" };
CodedValue cv2 = new CodedValue(){ Code = "B",  Value = "2" };
IList<CodedValue> cvList = new List<CodedValue>();
cvList.Add(cv1);
cvList.Add(cv2);

cvList には、フィルタリングする CodedValue のリストが含まれています。

私のデータベースにこれらのレコードが含まれているとしましょう:

CODE     VALUE
A        1
A        2
B        1
B        2

今、コード化された値がリストにあるすべてのオブジェクトを取得したい

var filter = from o in MyRepository.List()
             where cvList.Contains(o.CodedValue)
             select o;

Hibernate は、この Linq を次のように変換します。

select [Fields...] from [Table...]
where Code in ('A', 'B') and Value in ('1', '2');

これは間違っています。私のレコードの例を見ると、この SQL はすべての行を返します。SQL は次のように変換する必要があります。

select [Fields...] from [Table...]
where (Code = 'A' and Value = '1') or (Code = 'B' and Value = '2');

では、Linq を使用して必要な結果を得ることができますか? もしそうなら、どのように?そうでない場合、どうすればそれを達成できますか?

ありがとう

4

1 に答える 1

5

わかりました、これが解決策です!

このウェブサイトの PredicateBuilder を使用しています: PredicateBuilder

次に、述語を作成します。

var expr = PredicateBuilder.False<Audit>();

foreach(CodedValue codedValue in auditEventIds)
{
  CodedValue cv = codedValue;
  expr = expr.Or(a => (a.EventId.Code == cv.Code) && (a.EventId.CodeSystemName == cv.CodeSystemName));
}

itemQuery = itemQuery.Where(expr);

ステートメントの行CodedValue cv = codedValueは非常に重要です。foreach行を省略すると正しい SQL 構文が作成されますが、パラメーターの値はすべて同じになります。

それが誰かを助けることを本当に願っています。

于 2009-12-01T21:48:29.800 に答える