Linq-запрос с левым объединением с несколькими таблицами - PullRequest
0 голосов
/ 26 марта 2012

Это мой запрос linq

    from row in (
    from c in db.TabC
    from cpd in db.TabPD
    from slm in db.TabSLM
    where cpd.SLid == slm.SLid
    where c.Id == cpd.CID
    where c.O_Id == 1
    select new { c, cpd, slm })
group row in row.slm.SLType into g
select new
{
    SLType = g.Key,
    EStat = g.Count(r => r.c.EstatID != null),
    Training = g.Count(r => r.cpd.TrId != null),
    TrainingComplete =
        g.Count(r => r.cpd.TrStat == 44),
    AssessmentComplete =
        g.Count(r => r.cpd.CndAssess == 44)
};

Мне нужно сделать левое соединение с таблицей db.TabSLM и получить столько записей, сколько есть в этой таблице. TabC является главной таблицей, как и TabSLM. TabPD имеет подробные записи, которые ссылаются как на TabC, так и на TabSLM. С этим запросом, когда в TabPD нет совпадений ни для идентификатора строки TabC, ни для идентификатора строки TabSLM, я не получаю никаких записей. Я хочу вернуть количество записей, присутствующих в TabSLM, если совпадений нет. Любые идеи о том, как изменить этот запрос?

Ниже приведен пример данных для каждой из трех таблиц с минимальными полями в списке

TabC
ID  O_ID   Name
1       1     ABC
2       1     XYZ
3       1     RST

TabPD
RowID    CID    SLid 
1        2      1
2        1      1
3        3      2
4        ...

TabSLM
SLid   SLType
1      single level 
2      Multi level

С помощью приведенного выше запроса я могу получить записи, где TabC.O_ID == 1, но не там, где TabC.O_ID == 3, поскольку у TabC.O_ID нет записей с ID == 3. Я все еще хочу для отображения SLType с другими столбцами, отображаемыми как 0

Спасибо за ваше время ...

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Вам нужно использовать DefaultIfEmpty

var query =
    from row in (
      from c in db.TabC
      join cpd in db.TabPD on c.Id equals cpd.CID
      from slm in db.TabSLM.Where(x => cpd.SLid == x.SLid)
                           .DefaultIfEmpty()
      where c.O_Id == 1
      select new { c, cpd, slm })
group row by row.slm.SLType into g
select new
{
    SLType = g.Key,
    EStat = g.Count(r => r.c.EstatID != null),
    Training = g.Count(r => r.cpd.TrId != null),
    TrainingComplete =
        g.Count(r => r.cpd.TrStat == 44),
    AssessmentComplete =
        g.Count(r => r.cpd.CndAssess == 44)
};
0 голосов
/ 11 декабря 2013

Просто попробуйте это один раз:

var query =
    from row in (
      from c in db.TabC
      join cpd in db.TabPD on c.Id equals cpd.CID into temp
                          from cpd in temp.DefaultIfEmpty()
      from slm in db.TabSLM.Where(x => cpd.SLid == x.SLid)
                           .DefaultIfEmpty()
      where c.O_Id == 1
      select new { c, cpd, slm })
group row by row.slm.SLType into g
select new
{
    SLType = g.Key,
    EStat = g.Count(r => r.c.EstatID != null),
    Training = g.Count(r => r.cpd.TrId != null),
    TrainingComplete =
        g.Count(r => r.cpd.TrStat == 44),
    AssessmentComplete =
        g.Count(r => r.cpd.CndAssess == 44)
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...