2016-08-25 2 views
2

Я хочу сделать левое внешнее соединение в Динамическое Linq, но я не могу получить синтаксис справа. В SQL это будет выглядеть следующим образом:C# - Динамическое Linq слева внешнее соединение по нескольким свойствам

SELECT col1, col2, col3 from tableA as a 
LEFT OUTER JOIN tableB as b on a.col1 = b.col1 AND a.col2 = b.col2 AND a.col3 = 1 

В динамической LINQ я попытался это:

dbContext.tableA 
.GroupJoin(tableB, col1 == tableA.col1 && col2 == tableA.col2 && col3 == 1) 
.Select('new(col1, col2, col3)'); 

Третий присоединиться параметр (столбец) просто жестко, потому что она не исходит от TableB. Каков правильный код linq?

EDIT: Это не дублирующий вопрос. Я ищу синтаксис, который работает с динамическим LINQ, а не с обычным linq

+0

Какая у вас проблема? Это просто синтаксис, который вам нужен? Попробуйте [документацию] (https://msdn.microsoft.com/en-us/library/bb534297%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) – slawekwin

+0

Возможный дубликат [LEFT OUTER JOIN in LINQ] (http://stackoverflow.com/questions/3404975/left-outer-join-in-linq) – uTeisT

+1

@Oktay - из документации динамического linq не похоже, что у них перегрузка GroupJoin –

ответ

0

Обычно для объединений и особенно для левых соединений я использую синтаксис операторов.

Не тестировался, но будет выглядеть примерно так:

var result = from a in tableA 
      from b in tableB.Where(x => x.col1 == a.col1 && x.col2 == a.col2 && a.col3 == 1).DefaultIfEmpty() 
      select new { a.col1, a.col2, b.col3 }; 

Делая .DefaultIfEmpty() на объединение с TableB, он будет рассматривать это как слева присоединиться. Если вы не укажете .DefaultIfEmpty(), тогда он будет вести себя как внутреннее соединение.

+0

Спасибо! Я не могу использовать синтаксис инструкции, потому что строка, которую я передаю в select(), является динамической и входит в функцию как параметр. –

+0

вам не нужно возвращать анонимный тип, вы можете выбрать новый MyObject {First = col1 и т. Д.} в качестве альтернативы, я его не пробовал, но если функция является адаптером данных, вы можете попробовать выбрать функцию с .Invoke() –

+0

здесь выглядит как хороший пример .SelectMany с левым соединением. http://stackoverflow.com/questions/584820/how-do-you-perform-a-left-outer-join-using-linq-extension-methods –