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

Вот запрос на 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
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39616742
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

покажи пример, что пишешь
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39616774
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала замутил что-то такое:
Код: 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
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39616805
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в первом накосячил, когда пример делал:
Код: 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
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39616916
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

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

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

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

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

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


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

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

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


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