2012-01-17 117 views
4

我需要在LINQ中创建一个语句,包含3个表和OR条件。linq连接3个表或条件

我的函数收到一个整数,我们称之为intZ。我有3个表格:tableA,tableBtableC

tableA具有列int1,int2intBintBtableB有关。

问题:int1tableAint2可以intZ,它有以配合一个tableC记录。

我需要一个OR条件,但我不知道该把它放在哪里。它在哪里去了?或者在等价条款中?

目前,我知道如何加入3张桌子,但条件是杀了我。

在linq中创建语句的两种方式有什么区别?是否有性能影响?

编辑:好吧,现在我认为它更清楚。 intZ必须与tableCintC相关,这个号码可以是int1int2tableA

enter image description here

+0

它更容易帮助你,如果你写下你的SQL查询,所以我们知道如何建立一个LINQ表达式。关于创建语句的两种方式,没有区别,只是你觉得哪一个更令人满意。 – 2012-01-17 19:01:27

+0

查询我创建它的错误,因为我没有使用tableC,那为什么我没有把它。 – 2012-01-17 19:13:18

+0

“atm i how hot”是什么意思? – Gabe 2012-01-17 19:13:21

回答

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 – 2012-01-17 19:24:47

+0

x是tableB中的一行(但仅在where子句中)我使用它来连接列A或B上的表a? – Magnus 2012-01-17 19:27:20

+0

con给我提供这种类型的查询的名称?它与我正在使用的结构不同。 thx – 2012-01-17 19:36:04

3

不能使用“或”条件联接在LINQ,因为它仅支持等值连接。但是你应该可以在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进入第三次连接我想,我必须匹配intz == tableC.id或rowA.int1 == tableC.id或rowa.int2 == tableC.id。你应该如何把tableC.id放在这里? – 2012-01-17 19:12:22

+0

@GuillermoVarini:对不起,现在仍然非常清楚所有这些是如何挂在一起的。如果你能给出一个* full *的例子,理想情况下比'int2'更有意义的名字,这将更清楚。 – 2012-01-17 19:22:30

+0

好吧,它现在有一张照片,并检查它的编辑说:我认为现在更清晰。 – 2012-01-17 19:35:14

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

对于我的生活,我无法得到的。凡在我的查询工作(也许这是我如何使用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});