Linq, как написать JOIN - PullRequest
       5

Linq, как написать JOIN

4 голосов
/ 08 марта 2011

Linq to EF, я использую asp.net 4, EF 4 и C #.

Вот два способа, которыми я придумала запросить мои данные.Способы А и С работают нормально.B, однако, необходимо реализовать и дополнительный оператор WHERE (как "где c.ModeContent ==" NA ").

Мой вопрос:

  • Относительно этого вида объединения (внешнего соединения, Я полагаю) каков наилучший подход с точки зрения производительности?
  • Не могли бы вы показать мне некоторый код для реализации дополнительного оператора WHERE в B?
  • Любой способ улучшить этот код?

Спасибо за ваше время!: -)

// A               
var queryContents = from c in context.CmsContents
    where c.ModeContent == "NA" &&
    !(from o in context.CmsContentsAssignedToes select o.ContentId)
    .Contains(c.ContentId)
    select c;

// B - I need to implent where c.ModeContent == "NA"
var result01 = from c in context.CmsContents
    join d in context.CmsContentsAssignedToes on c.ContentId equals d.ContentId into g
    where !g.Any()
    select c;

// C
var result02 = context.CmsContents.Where(x => x.ModeContent == "NA").Where(item1 => context.CmsContentsAssignedToes.All(item2 => item1.ContentId != item2.ContentId));

Ответы [ 2 ]

3 голосов
/ 08 марта 2011

Ваш запрос будет далеко более читабельным и обслуживаемым (и, по крайней мере, так же эффективен), если вы используете свои свойства ассоциации вместо join:

var result = from c in context.CmsContents
             where c.ModeContent == "NA"
                && !c.AssignedToes.Any()
             select c;

Я предполагаю, что навигация от CmsContent до CmsContentsAssignedToes называется AssignedToes.Измените имя в моем запросе, если оно на самом деле называется чем-то другим.

Этот запрос можно прочитать вслух, и вы точно знаете, что это значит.join версии, о которых вы должны подумать.

3 голосов
/ 08 марта 2011

Относительно запроса B вы можете применить условие следующим образом:

var result01 = from c in context.CmsContents where c.ModeContent == "NA"
join d in context.CmsContentsAssignedToes on c.ContentId equals d.ContentId into g
where !g.Any()
select c;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...