Соединение SQL с Linq слева с оператором AND в операторе SQL - PullRequest
1 голос
/ 01 марта 2012

У меня есть SQL-запрос, который отлично работает, и мне нужно преобразовать его в Linq. Мне нужно вернуть все записи одной таблицы и присоединить ее ко второй таблице. Мне нужно вернуть все результаты из первой таблицы, объединенной с результатами из второй таблицы, где значение определенного поля во второй таблице равно значению переменной (75 в примере ниже) или возвращает ноль.

Таким образом, общее количество строк в результате должно быть общим количеством строк из таблицы1. Часть строки из объединения из таблицы2 должна либо отображать значения из таблицы2, где существует запись со значением 75, либо ноль, если запись не существует.

РЕДАКТИРОВАТЬ: я должен упомянуть, что t1.field1 является int и t2.field1 является обнуляемым int.

Я попробовал несколько утверждений linq, группировку соединений, опрос коллег и поиск в Google, пока у меня не потекли глаза. Я застрял. Я понимаю, что формулировка моего вопроса может быть неясной, и заранее прошу прощения, если это не так.

Заранее спасибо. Chris

SQL-запрос:

SELECT *
FROM table1 AS t1 LEFT OUTER JOIN 
table2 AS t2 ON t1.field1 = t2.field1 AND t2.field2 = 75

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

Спасибо за ваши ответы. Поскольку мне нужны некоторые значения NULL, но только те, в которых конкретный идентификатор имеет значение NULL, а не все значения, которые имеют значение NULL, ни одно из приведенных выше решений не будет работать. Кажется, что сделать это в linq будет очень сложно, если это возможно.

Итак, ради времени я решил взять работающий SQL-запрос и превратить его в импорт хранимых процедур и функций. Я чувствую, что это, вероятно, не правильный способ сделать это, но время всегда является фактором.

Еще раз спасибо за ваши ответы.

0 голосов
/ 01 марта 2012

Используйте DefaultIfEmpty - см. LINQ - Левое объединение, Группировка по и Количество и http://msdn.microsoft.com/en-us/library/bb397895.aspx для примеров того, как этого добиться

Ответ, который работает, ноне так элегантно, как я ожидал:

var q = from item1 in table1  
            join item2 in table2 on new { Field1=(int?)item1.Field1, Field2=75 }  
                   equals new { item2.Field1, item2.Field2 } into gj  
            from subItem2 in gj.DefaultIfEmpty()  
            select new { F1= item1.Field1, F2 = ( subItem2 == null ? string.Empty : subItem2.Field2.ToString()) };

Я не мог видеть, куда вписать условие where (Field2 = 75), поэтому вместо этого пошел с комбинированным ключом между таблицами, чтобы достичьтот же эффект.

Второй бит уродства - приведение к обнуляемому int, потому что или Field1 в составном ключе, поэтому его можно приравнять к соответствующему полю в таблице 2.

Очевидно, вы возвращаетесь в анонимном типелюбые значения, которые вас интересуют. Обратите внимание, что вы не можете вернуть ноль, поэтому я показал строковое представление Field2, чтобы вы могли увидеть, что возвращается из второй таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...