linq объединить 3 таблицы с условием или - PullRequest
4 голосов
/ 17 января 2012

Мне нужно создать оператор в LINQ с 3 таблицами и условием ИЛИ.

Моя функция получает целое число, давайте его назовем intZ. У меня есть 3 таблицы: tableA, tableB и tableC.

tableA имеет столбцы int1, int2 и intB. intB относится к tableB.

проблема: int1 или int2 из tableA может иметь значение intZ и должно совпадать с одной tableC записью.

Мне нужно условие ИЛИ, но я не знаю, где его разместить. Это входит в пункт, где? Или в предложении равных?

На данный момент я знаю, как объединить 3 стола, но условие меня убивает.

В чем разница между двумя способами создания операторов в linq? Есть ли влияние на производительность?

edit: Хорошо, теперь я думаю, что это более понятно. intZ должно быть связано с intC из tableC, и это число может быть int1 или int2 из tableA.

enter image description here

Ответы [ 5 ]

11 голосов
/ 17 января 2012

Просто добавьте его к 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 };
3 голосов
/ 17 января 2012

Вы не можете использовать условие "или" в соединениях в 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 };
2 голосов
/ 28 мая 2012

Это может быть полезно.

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 голос
/ 28 августа 2012

За всю жизнь я не смог получить .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 голосов
/ 05 апреля 2016

Попробуйте это: -

var result= tableA.SelectMany(a => tableB.Where(x => x.A == a.A || x.B == a.B), (a, b) => new {a, b});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...