2012-01-17 12 views
4

3テーブルとOR条件でLINQでステートメントを作成する必要があります。linq 3テーブルまたは条件付き

私の関数は整数を受け取り、それをintZと呼ぶことができます。私は3つのテーブル:tableA,tableBおよびtableCを持っています。

tableAは、int1,int2およびintBの列を有する。 intBtableBに関連しています。

問題:tableAint1またはint2intZすることができ、それが1枚のtableCレコードと一致する必要があります。

OR条件が必要ですが、どこに配置するかわかりません。それはwhere句に入りますか?またはequals節で?

現在、私は3つのテーブルを結合する方法を知っていますが、条件が私を殺しています。

linqでステートメントを作成する2つの方法の違いは何ですか?パフォーマンスへの影響はありますか?

編集:さて、私はそれがもっと明らかだと思います。 intZは、intCtableCから関連していなければならず、この数値はint1またはとなります。あなたはそれが唯一の等価結合をサポートしていますようには、LINQに参加する「または」条件を使用することはできません

enter image description here

+0

その我々はLINQの式を作成する方法を知っているので、あなたのSQLクエリを書き留めた場合のお手伝いをしやすいです。ステートメントを作成する2つの方法に関して、相違はありません。それは、どちらがあなたがより幸せに感じるのかだけです。 –

+0

私はテーブルCを使わなかったので、私はそれを間違って作成しました。 –

+0

「atm i how hot」はどういう意味ですか? – Gabe

答えて

11

Whereに追加するだけです。 Linq2Sqlでは、これはテーブルBの内部結合(またはで)に変換されます

from a in tableA 
from b in tableB.Where(x => x.A == a.A || x.B == a.B) 
select new { a, b }; 
+0

linqでこのタイプのクエリ文を使用したことはありません。 xは何ですか?私はこれを前に見ましたが、私は同じことを知らないので、私はそれについてもっと読むことができます。私にリンクや名前を教えてもらえますか? thx –

+0

xはテーブルBの行です(ただし、where句内のみ)。これを使用して、列AまたはBのテーブルaに結合します。 – Magnus

+0

このタイプのクエリの名前を指定しますか?それは使用しているものとは異なる構造をしています。 thx –

3

。しかし、問題なくwhere節でそれを実行できるはずです。例:

var query = from rowC in tableC 
      where rowC.intC == intZ 
      from rowA in tableA 
      where rowA.int1 == rowC.intC || rowA.int2 == rowC.intC 
      join rowB in tableB on rowA.intB equals rowB.intB 
      select new { rowA, rowB, rowC }; 
+0

tableCは3番目のジョインになります。intz == tableC.idまたはrowA.int1 == tableC.idまたはrowa.int2 == tableC.idと一致させる必要があります。これでtableC.idをどのように置くべきでしょうか? –

+0

@GuillermoVarini:申し訳ありませんが、これはすべてが一緒にハングアップすることを意味しています。理想的には、 'int2'よりも意味のある名前で*完全な例を与えることができれば、より明確になります。 –

+0

ok、その写真があり、編集がどこにあるかを確認します:今はもっとはっきりしていると思います。 –

2

これは役に立つかもしれません。私の人生のために

var locations = from r1 in 
      (from a in context.A 
      join b in context.B 
      on a.ID equals b.ID 
      select new 
      { 
      a.Prop1, 
      a.Prop2, 
      b.Prop3, 
      b.ID 
      }) 
      join c in context.C 
      on r1.ID equals c.ID 
      select new 
      { 
      r1.Prop1, 
      r2.Prop2, 
      r2.Prop3, 
      c.Prop4 
      }; 
1

、私は.Whereが私のクエリで動作させることができなかった(多分それは私がLinqPadを使用している方法です)が、私は仕事に以下を得ることができた:

from s in Stores 
join a in Areas on s.AreaID equals a.ROWID 
join r in Regions on a.RegionID equals r.ROWID 
join e in Employees on 1 equals 1  // <-- produces a cartesian product 
join t in Titles on e.TitleID equals t.ROWID 
where e.AreaID == a.ROWID || e.RegionID == r.ROWID // <--filters the data based on OR stmt 
where s.StoreNum == 469 
select new { r.RegionName, a.AreaName, s.StoreNum, s.StoreName, t.JobCode, e.FirstName, e.LastName } 
0

はこれを試してください: -

var result= tableA.SelectMany(a => tableB.Where(x => x.A == a.A || x.B == a.B), (a, b) => new {a, b}); 
関連する問題