Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN / 25 сообщений из 65, страница 1 из 3
19.03.2018, 11:34
    #39616686
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
То ли задачка то ли оказалась нетривиальной, то ли я где-то сильно затупил.

Вот запрос на SQL
Код: sql
1.
2.
3.
4.
5.
SELECT  ...
FROM    Customers
        LEFT JOIN Orders ON Customers.Id = Orders.CustomerId
        LEFT JOIN Goods ON Orders.Id = Goods.OrderId
WHERE   Customers.Id IN (1,2,3)



У покупателя может не быть заказов, либо у заказов может не быть товаров, в этом случае я должен получить только поля покупателя и NULL для полей заказа и товара.

При попытке написать на Linq2EF я либо получаю NullReferrenceException при попытке второго джойна (так как нет объекта, из которого надо достать id), либо отбор несколькими запросами, при этом внутренних таблиц не производится фильтрация в БД, то есть на клиента приходят все заказы и все товары и только потом фильтруются.

В общем, как написать этот запрос для EF?
...
Рейтинг: 0 / 0
19.03.2018, 12:46
    #39616742
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Shocker.Pro,

покажи пример, что пишешь
...
Рейтинг: 0 / 0
19.03.2018, 13:26
    #39616774
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Сначала замутил что-то такое:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
from customer in db.Customers
join order in db.Orders on customer.Id equals order.CustomerId
into orders
from order in orders.DefaultIfEmpty()
select new { customer, order }
into customerOrder
join good in db.Goods on customerOrder.order.Id equals good.OrderId
into orders
from order in orders.DefaultIfEmpty()
select new { customerOrder.customer, customerOrder.order, good}
into customerOrderGood


Потом такое:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
from customer in db.Customers
join ord in
	(from order in db.Orders
	join gd in
		(from good in db.Goods
		join model in db.Models on good.Id equals model.GoodId
		into models
		select new { good, models }) on order.Id equals gd.good.OrderId
	into goods
	select new { order, goods }) on customer.Id equals ord.order.CustomerId
into orders
...
Рейтинг: 0 / 0
19.03.2018, 14:01
    #39616805
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
в первом накосячил, когда пример делал:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
from customer in db.Customers
join order in db.Orders on customer.Id equals order.CustomerId
into orders
from order in orders.DefaultIfEmpty()
select new { customer, order }
into customerOrder
join good in db.Goods on customerOrder.order.Id equals good.OrderId
into goods
from good in goods.DefaultIfEmpty()
select new { customerOrder.customer, customerOrder.order, good}
into customerOrderGood
...
Рейтинг: 0 / 0
19.03.2018, 16:31
    #39616916
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Shocker.Pro,

а чё, нету навигационных полей, типа customer.Order? если есть, решается
...
Рейтинг: 0 / 0
19.03.2018, 16:33
    #39616920
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
похоже на то, что запрос материализуется сразу, а не транслируется в SQL
...
Рейтинг: 0 / 0
19.03.2018, 16:39
    #39616922
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
hVosttа чё, нету навигационных полей, типа customer.Order? если есть, решаетсяПоля есть (не customer.Order, а customer.Orders разумеется), но с ними совсем не взлетает. Гуглил, как я понял проблема сгенерить проекцию с нормальными джойнами, не получив N+1 запросов к базе, не решена (точнее решена в каком-то очень частном случае и только с одним уровнем джойна). Может ты подскажешь как?

hVosttпохоже на то, что запрос материализуется сразу, а не транслируется в SQLНет, в первом случае я получаю ровно один запрос к базе. Во втором N-1 (по количеству вложенных уровней), что тоже устраивало бы, только нижние уровне не фильтруются на уровне запроса к БД.
...
Рейтинг: 0 / 0
19.03.2018, 16:40
    #39616925
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Code First, EF Core
...
Рейтинг: 0 / 0
19.03.2018, 16:43
    #39616930
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Shocker.ProCode First, EF Core

А, Core... понятно. Именно EF он ещё очень сырой, при чём настолько, что практически неюзабельно. Половина проекций не работает, группировка? давай досвидания... Миграции, как повезёт вообще, да и не работают толком как в EF 6.

Только SELECT N+1, советовал бы уйти на другой провайдер, в версии EF Core от него пользы как от козла молока. Ещё годик другой может.
...
Рейтинг: 0 / 0
19.03.2018, 16:56
    #39616943
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Shocker.ProУ покупателя может не быть заказов, либо у заказов может не быть товаров, в этом случае я должен получить только поля покупателя и NULL для полей заказа и товара.нет логики в запросе.
Как заказ без товаров?
Покажи тест запроса на базе.
...
Рейтинг: 0 / 0
19.03.2018, 17:04
    #39616950
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
hVostt,
Проверить, core виноват или нет, не долго. В демке на ef6.
...
Рейтинг: 0 / 0
19.03.2018, 17:09
    #39616952
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Shocker.ProУ покупателя может не быть заказов, либо у заказов может не быть товаров, в этом случае я должен получить только поля покупателя и NULL для полей заказа и товара.
Либо запрос к товарам а не к покупателям.
Либо запрос к покупателям с агрегацией и сведением количества заказов.
Imho
...
Рейтинг: 0 / 0
19.03.2018, 17:25
    #39616974
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Petro123нет логики в запросе.не ищи логику, это пример, а не рабочий код, хочешь - в зайцев перепиши.
...
Рейтинг: 0 / 0
19.03.2018, 17:29
    #39616978
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Shocker.ProPetro123нет логики в запросе.не ищи логику, это пример, а не рабочий код, хочешь - в зайцев перепиши.
А что ее искать, если запрос не к той сущности.
Запрос должен быть логичен, а не джойнить все подряд.
Логично?
...
Рейтинг: 0 / 0
19.03.2018, 17:29
    #39616979
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
hVosttА, Core... понятно. Именно EF он ещё очень сырой, при чём настолько, что практически неюзабельно. Половина проекций не работает, группировка? давай досвидания... Миграции, как повезёт вообще, да и не работают толком как в EF 6.Ну интересно, они что, с нуля его писали? Я полагал, большинство кода взято все-таки с EF6. Ну и не могу же я юзать EF6 под ASP.NET Core.

Опять же - задача-то абсолютно тривиальная - два Left Joina. Ну а как это решается в EF6?


hVosttсоветовал бы уйти на другой провайдер, в версии EF Core от него пользы как от козла молока. Ещё годик другой может.вот это не совсем понял
...
Рейтинг: 0 / 0
19.03.2018, 17:32
    #39616981
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Petro123А что ее искать, если запрос не к той сущности.
Запрос должен быть логичен, а не джойнить все подряд.
Логично?Не логично, я не буду тратить время, расписывая тебе реальную бизнес-модель полдня. Есть конкретная выборка, которую я хочу получить - два вложенных отношения один-ко-многим, названия сущностей можешь свои подставить, если тебя коробит.
...
Рейтинг: 0 / 0
19.03.2018, 17:37
    #39616984
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Shocker.Proдва вложенных отношения один-ко-многим,
Сторону Многие сворачиваем через count?
...
Рейтинг: 0 / 0
19.03.2018, 17:40
    #39616985
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Shocker.Pro,

Список чего тебя интересует? Товаров? Заказов? Клиентов?
Может Много ко Много отношения?
...
Рейтинг: 0 / 0
19.03.2018, 17:42
    #39616987
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Petro123Сторону Многие сворачиваем через count?Да блин, ничего не сворачиваем, я же пример написал на SQL - ты видишь там Count?
В итоге мне нужно загрузить иерархическую модель в дерево.
Я конечно могу написать это ручками тремя запросами послойно, если нет другого выхода, но странно, если его нет.
...
Рейтинг: 0 / 0
19.03.2018, 17:44
    #39616989
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Shocker.Proя же пример написал на SQL -я просил тест к базе и 5 строк результат.
...
Рейтинг: 0 / 0
19.03.2018, 17:47
    #39616991
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Shocker.ProДа блин, ничего не сворачиваем, я
Блин! ))))
Если не сворачивать, то запрос к отношению Много!
Т.е. from Заказы!
Так?
...
Рейтинг: 0 / 0
19.03.2018, 17:50
    #39616994
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Ну или
Right, outer, left, ....чообы null появились.
...
Рейтинг: 0 / 0
19.03.2018, 17:51
    #39616996
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Petro123Т.е. from Заказы!Какая разница между
FROM Заказы RIGHT JOIN Покупатели и
FROM Покупатели LEFT JOIN Заказы
Если тебе не нравится LEFT JOIN перепиши на RIGHT JOIN - суть не поменяется
Базовая таблица - Покупатели в данном случае
...
Рейтинг: 0 / 0
19.03.2018, 17:58
    #39616999
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Shocker.ProБазовая таблица - Покупатели в данном случае
Дело твоё.
Возможно парсер линка не такой крутой как парсер субд.
Чтобы понимать что такое базовая таблица.
Я бы сделал тест в базе. Потом на ef6.
Удачи!
...
Рейтинг: 0 / 0
20.03.2018, 07:59
    #39617174
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
Petro123hVostt,
Проверить, core виноват или нет, не долго. В демке на ef6.

Чё проверять, я знаю, что представленный код шокером, работает на EF6, без каких-то проблем. Мы пытались заюзать EF Core для небольшого проекта и встретили такую гору проблем, что решили, что пока как-нибудь без него. Взяли даппер.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN / 25 сообщений из 65, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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