powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ LEFT JOIN с проверкой на NULL
18 сообщений из 18, страница 1 из 1
LINQ LEFT JOIN с проверкой на NULL
    #37411815
Вообщем такая задача. Надо перевести SQL код в LINQ запрос.

Код: plaintext
1.
2.
3.
Select * From Table1 t1
	Left Join Table2 t2 On (t1.Col1 = t2.Col1 Or t2.Col1 Is NULL) And 
		                  (t1.Col2 = t2.Col2 Or t2.Col2 Is NULL)
	Where t2.ID Is Null

Бьюсь уже целый день. Ничего не выходит. Может поможет кто?
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37411955
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
var x = from t1 in db.Table1s
        join t2 in db.Table2s on new { с1 = t1.Col1, с2 = (int?)null, с3 = t1.Col2, с4 = (int?)null }
            equals new { с1 = t2.Col1, с2 = t2.Col1, с3 = t2.Col2, с4 = t2.Col2 } into t2_join
        from t2 in t2_join.DefaultIfEmpty()
        where t2.ID == null
        select new
        {
            t1,
            t2
        };
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412150
авторMCY
Спасибо, но код транслируется след. образом

Код: plaintext
1.
2.
3.
Select * From Table1 t1
	Left Join Table2 t2 On (t1.Col1 = t2.Col1 And t2.Col1 Is NULL) And 
		                  (t1.Col2 = t2.Col2 And t2.Col2 Is NULL)
	Where t2.ID Is Null
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412313
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Что-то я не увиде разницы между начальным запросом и тем, в который транслируется.

Сам запрос какой-то странный. В результат должны попасть те строки из первой таблице для которых нет связи со второй по кол1 и кол2?

тогда просто:

Код: plaintext
1.
2.
3.
Select * From Table1 t1
	Left Join Table2 t2 On (t1.Col1 = t2.Col1) And 
		                  (t1.Col2 = t2.Col2)
	Where t2.ID Is Null

Начальный запрос эквивалентен:

Код: plaintext
1.
2.
3.
Select * From Table1 t1
	Left Join Table2 t2 On (t1.Col1 = t2.Col1) And 
		                  (t1.Col2 = t2.Col2)
	Where t2.ID Is Null  Or t2.Col1 Is NULL Or t2.Col2 Is NULL
Не связи - так все колонки из второй таблице будут NULL и незачем их всех перечислять.
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412324
Надо
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412327
Надо
Код: plaintext
1.
2.
3.
Select * From Table1 t1
	Left Join Table2 t2 On (t1.Col1 = t2.Col1 Or t2.Col1 Is NULL) And 
		                  (t1.Col2 = t2.Col2 Or t2.Col2 Is NULL)
	Where t2.ID Is Null
Получаю

Код: plaintext
1.
2.
3.
Select * From Table1 t1
	Left Join Table2 t2 On (t1.Col1 = t2.Col1 And t2.Col1 Is NULL) And 
		                  (t1.Col2 = t2.Col2 And t2.Col2 Is NULL)
	Where t2.ID Is Null

Разница в OR и AND
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412442
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Георгий ДавидовичавторMCY
Спасибо, но код транслируется след. образом

Код: plaintext
1.
2.
3.
Select * From Table1 t1
	Left Join Table2 t2 On (t1.Col1 = t2.Col1 And t2.Col1 Is NULL) And 
		                  (t1.Col2 = t2.Col2 And t2.Col2 Is NULL)
	Where t2.ID Is Null


Он не транслируется в этот запрос, это Вы сами выдумали.

P.S. Приведите пример с данными в таблицах, в котором сможете продемонстрировать несоответствие выборок через исходный запрос и linq-запрос.
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412472
МСУОн не транслируется в этот запрос, это Вы сами выдумали.

P.S. Приведите пример с данными в таблицах, в котором сможете продемонстрировать несоответствие выборок через исходный запрос и linq-запрос.

Хммм... Ну смотрите
http://s014.radikal.ru/i326/1108/f1/2fcdb8c13dc3.jpg
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412480
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Георгий ДавидовичХммм... Ну смотрите
А профайлер что говорит?
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412486
При чем тут профайлер?

Вот реальный селект.

http://i038.radikal.ru/1108/90/6e8ac74f4c7b.png

У меня возвращатся 1 строка, у вас 2 строки.
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412532
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Георгий ДавидовичПри чем тут профайлер?

Притом, что только он может показать сгенеренный запрос. Либо используйте Log контекста.
То, что показываете Вы - гавно на постном масле. Не понятно?
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412593
Вот то говно, которое ловит профайлер
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SELECT  *
FROM    [Table_1] AS [Extent1]
        LEFT OUTER JOIN [Table_2] AS [Extent2] ON (
                                                                    ( [Extent1].Col1 = [Extent2].Col1 )
                                                                    OR (
                                                                         ( [Extent1].Col1 IS NULL )
                                                                         AND ( [Extent2].Col1 IS NULL )
                                                                       )
                                                                  )
                                                                  AND (
                                                                        [Extent2].Col1 = ( CAST(NULL AS int) )
                                                                        OR [Extent2].Col1 IS NULL
                                                                      )
                                                                  AND (
                                                                        ( [Extent1].Col2 = [Extent2].Col2 )
                                                                        OR (
                                                                             ( [Extent1].Col2 IS NULL )
                                                                             AND ( [Extent2].Col2 IS NULL )
                                                                           )
                                                                      )
                                                                  AND (
                                                                        [Extent2].Col2 = ( CAST(NULL AS int) )
                                                                        OR [Extent2].Col2 IS NULL
                                                                      )
WHERE   [Extent2].[ID] IS NULL

и которое возвращает опять 2 записи на тех же данных, что неверно. Мне нужна 1 запись...
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412640
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
var query = Table1s.Where(x=> !Table2s.Any(y=> (x.Col1 == y.Col1 || y.Col1 == null) && (x.Col2 == y.Col2 || y.Col2 == null)));

query.Dump();
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412645
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верблюд
Код: plaintext
1.
2.
var query = Table1s.Where(x=> !Table2s.Any(y=> (x.Col1 == y.Col1 || y.Col1 == null) && (x.Col2 == y.Col2 || y.Col2 == null)));

query.Dump();


если в Table2.Id not null
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412783
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Георгий ДавидовичВот то говно, которое ловит профайлер

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
using (var db = new ModelDataContext())
{
    string sql = string.Empty;
    db.Log = new ActionTextWriter(s => sql += s);

    var query = (from t1 in db.Table1s
            join t2 in db.Table2s on new { с1 = t1.Col1, с2 = (int?)null, с3 = t1.Col2, с4 = (int?)null }
                equals new { с1 = t2.Col1, с2 = t2.Col1, с3 = t2.Col2, с4 = t2.Col2 } into t2_join
            from t2 in t2_join.DefaultIfEmpty()
            where t2.ID == null
            select new
            {
                t1,
                t2
            }).ToList();
}

говно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SELECT  *
FROM    [Table_1] AS [Extent1]
        LEFT OUTER JOIN [Table_2] AS [Extent2] ON (
                                                                    ( [Extent1].Col1 = [Extent2].Col1 )
                                                                    OR (
                                                                         ( [Extent1].Col1 IS NULL )
                                                                         AND ( [Extent2].Col1 IS NULL )
                                                                       )
                                                                  )
                                                                  AND (
                                                                        [Extent2].Col1 = ( CAST(NULL AS int) )
                                                                        OR [Extent2].Col1 IS NULL
                                                                      )
                                                                  AND (
                                                                        ( [Extent1].Col2 = [Extent2].Col2 )
                                                                        OR (
                                                                             ( [Extent1].Col2 IS NULL )
                                                                             AND ( [Extent2].Col2 IS NULL )
                                                                           )
                                                                      )
                                                                  AND (
                                                                        [Extent2].Col2 = ( CAST(NULL AS int) )
                                                                        OR [Extent2].Col2 IS NULL
                                                                      )
WHERE   [Extent2].[ID] IS NULL

и которое возвращает опять 2 записи на тех же данных, что неверно. Мне нужна 1 запись...

Log
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT [t0].[Col1],
       [t0].[Col2],
       [t2].[test],
       [t2].[Col1] AS [Col12],
       [t2].[Col2] AS [Col22],
       [t2].[ID]
FROM   [dbo].[Table1] AS [t0]
       LEFT OUTER JOIN (
                SELECT  1  AS [test],
                       [t1].[Col1],
                       [t1].[Col2],
                       [t1].[ID]
                FROM   [dbo].[Table2] AS [t1]
            ) AS [t2]
            ON  ([t0].[Col1] = [t2].[Col1])
            AND ([t2].[Col1] IS NULL)
            AND ([t0].[Col2] = [t2].[Col2])
            AND ([t2].[Col2] IS NULL)
WHERE  [t2].[ID] IS NULL 
       -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build:  4 . 0 . 30319 . 1 
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37412788
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Георгий Давидович, я же Вам говорил, приведите пример заполнения таблиц (инсерты). Будем смотреть, а не ворочать кофейную гущу.
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37414147
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Георгий ДавидовичНадо
Код: plaintext
1.
2.
3.
Select * From Table1 t1
	Left Join Table2 t2 On (t1.Col1 = t2.Col1 Or t2.Col1 Is NULL) And 
		                  (t1.Col2 = t2.Col2 Or t2.Col2 Is NULL)
	Where t2.ID Is Null
Получаю

Код: plaintext
1.
2.
3.
Select * From Table1 t1
	Left Join Table2 t2 On (t1.Col1 = t2.Col1 And t2.Col1 Is NULL) And 
		                  (t1.Col2 = t2.Col2 And t2.Col2 Is NULL)
	Where t2.ID Is Null
Разница в OR и AND
Прошу прощения, не заметил.
Однако приведенный мною заменяющий запрос, насколько я понял, соответствуют Вашим требованиям. Найти записи в таблице 1, у которых нет соответствия в таблице 2 по ключам.

Я рекомендую Вам переписать автотосгенерированные м запросы, а не нагружать мозг участникам форума запутанными вещами.
...
Рейтинг: 0 / 0
LINQ LEFT JOIN с проверкой на NULL
    #37414161
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
МСУГеоргий Давидович, я же Вам говорил, приведите пример заполнения таблиц (инсерты). Будем смотреть, а не ворочать кофейную гущу.
Так он привел.

http://i038.radikal.ru/1108/90/6e8ac74f4c7b.png

В виде картинки.

Я не умею делать запросы к картинкам.
Но вроде ты более продвинутый . Поделись знаниями, как сделать выборку по картинке в JPG
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ LEFT JOIN с проверкой на NULL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]