Linq Left Join, где right имеет значение null

относительно новый для linq, исходящий из SQL. Итак, я пытаюсь выяснить левые соединения для следующего:

SELECT * from MASTER m
LEFT JOIN CHILD C
    ON m.ID=C.MASTER_ID
WHERE C.MASTER_ID is null

Таким образом, обычно это возвращает все записи от Мастера, у которых нет ребенка. Я обнаружил .DefualtIfEmpty (), но это не устраняет основные записи, в которых есть дети.

Я начал:

var recs=from m in MASTER
         from c in child
             .where (mapping=>mapping.MasterId == m.Id)
             .DefaultIfEmpty()
         select new { MasterId = m.Id};

Но это насколько я добрался и застрял. Я предполагаю, что .DefaultIfEmpty () не то, что я ищу. Примечание. В главной таблице содержится несколько миллионов строк. Дети близки к одному и тому же счету. Я упоминаю только потому, что будет неэффективно отбрасывать все записи и т. Д. В идеале созданный SQL будет выглядеть как SQL, который я разместил.

Спасибо всем.

c#,.net,linq,linq-to-sql,

1

Ответов: 3


1 принят

Это даст вам все основные записи без детей.

var recs = MASTER.Where(x => !child.Any(y => m.Id == c.MasterId));

!Anyбудет генерировать not ExistsSQL заявление , которое будет переведено в anti semi joinв плане исполнения , который является лучшим вы можете получить для этого типа проверки.


2

Если вы используете EF, вы можете получить мастера, у которых нет детей, используя свойство навигации, которое представляет детей:

var result= from m in MASTER
            where m.Children.Count()==0// or m.Any()
            select m;

Если вы хотите сделать это, используя явное соединение в linq, вы можете попробовать следующее:

var recs=from m in MASTER
         join c in child on m.Id equals C.MasterId into gj
         where gj.Count()==0 // or gj.Any()
         select m;

0

Приведенная ниже ссылка может помочь вам:

http://www.devcurry.com/2011/01/linq-left-join-example-in-c.html

Отметьте как ответ, если это поможет.

C # ,. сеть, LINQ, LINQ к SQL,
Похожие вопросы