5

計画とドキュメントがあるとしましょう

Dim myPlans = _context.Plans.Where(predicate1)
Dim myDocuments = _context.Documents.Where(predicate2)

PredicateBuilderを使用して、それぞれのwhere句を構造化しました。したがって、myPlansとmyDocumentsには正しいSQLステートメントがあります。

私がやりたいのは、これら2つのテーブルを1つのlinqステートメントに結合することです。私が抱えている問題は、デフォルトでは、AND条件がwhere句を結合していることです。

myPlans Where句:(p.name like "%test%" AND p.name like "%bed%")OR(p.description like "%test%" AND p.description like "%bed%")

myDocuments Where句:(d.name like "%test%" AND d.name like "%bed%")OR(d.description like "%test%" AND d.description like "%bed%")

2つを組み合わせると、望ましい結果のWhere句は次のようになります
。Where(d.ID = p.ID)AND(myplans where句)OR(mydocument where句)。つまり、各テーブルの2つのwhere句を「And」ではなく「or」にします。

現在の結果のwhere句は次のとおりです。Where(d.ID = p.ID)AND(myplans where句上記)AND(mydocument where句上記)。つまり、各テーブルの2つのwhere句を「And」ではなく「or」にします。

私は次のようなステートメントを作成しています:

Dim test = From d in myDocuments _
           Join p in MyPlans on d.ID Equals p.ID _
           Select d.Name, p.Name
4

2 に答える 2

3

目的の結果を得るには、述語のフィルタリングと結合を1つのステートメントで実行する必要があります。

Dim myCriteria() = {"test", "bed"}
Dim test = from d in _context.Documents _
           join p in _context.Plans on d.ID Equals p.ID _
           where (myCriteria.Contains(d.Name) OR _
                   myCriteria.Contains(d.Descrition)) _
           OR (myCriteria.Contains(p.Name) OR _
                 myCriteria.Contains(p.Description)) _
           select Document = d.Name, Plan = p.Name
于 2009-04-25T08:38:45.550 に答える
2

これは、述語に一致するプランとドキュメントをフィルタリングする「ファーストパス」を実行し、それらの結果のみAND結合して、効果的にを実行しているために発生します。バジリオが言ったように、あなたは同じパスであなたの結合/フィルターをするべきです。あなたはこのようなことを試みるかもしれません:

Dim test = From d in _context.Documents _
           Join p in _context.Plans on d.ID Equals p.ID _
           Where predicate1(p) Or predicate2(d)
           Select d.Name, p.Name

または同様に:

Dim test = From d in _context.Documents _
           From p in _context.Plans _
           Where d.ID = p.ID And (predicate1(p) Or predicate2(d))
           Select d.Name, p.Name
于 2009-04-25T18:28:00.703 に答える