Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
То ли задачка то ли оказалась нетривиальной, то ли я где-то сильно затупил.

Вот запрос на SQL
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?
19 мар 18, 11:34    [21267173]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro,

покажи пример, что пишешь
19 мар 18, 12:46    [21267473]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
Сначала замутил что-то такое:
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

Потом такое:
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
19 мар 18, 13:26    [21267620]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
в первом накосячил, когда пример делал:
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
19 мар 18, 14:01    [21267746]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro,

а чё, нету навигационных полей, типа customer.Order? если есть, решается
19 мар 18, 16:31    [21268718]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
похоже на то, что запрос материализуется сразу, а не транслируется в SQL
19 мар 18, 16:33    [21268729]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
hVostt
а чё, нету навигационных полей, типа customer.Order? если есть, решается
Поля есть (не customer.Order, а customer.Orders разумеется), но с ними совсем не взлетает. Гуглил, как я понял проблема сгенерить проекцию с нормальными джойнами, не получив N+1 запросов к базе, не решена (точнее решена в каком-то очень частном случае и только с одним уровнем джойна). Может ты подскажешь как?

hVostt
похоже на то, что запрос материализуется сразу, а не транслируется в SQL
Нет, в первом случае я получаю ровно один запрос к базе. Во втором N-1 (по количеству вложенных уровней), что тоже устраивало бы, только нижние уровне не фильтруются на уровне запроса к БД.
19 мар 18, 16:39    [21268774]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
Code First, EF Core
19 мар 18, 16:40    [21268786]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
Code First, EF Core


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

Только SELECT N+1, советовал бы уйти на другой провайдер, в версии EF Core от него пользы как от козла молока. Ещё годик другой может.
19 мар 18, 16:43    [21268815]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro
У покупателя может не быть заказов, либо у заказов может не быть товаров, в этом случае я должен получить только поля покупателя и NULL для полей заказа и товара.
нет логики в запросе.
Как заказ без товаров?
Покажи тест запроса на базе.
19 мар 18, 16:56    [21268909]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
hVostt,
Проверить, core виноват или нет, не долго. В демке на ef6.
19 мар 18, 17:04    [21268976]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro
У покупателя может не быть заказов, либо у заказов может не быть товаров, в этом случае я должен получить только поля покупателя и NULL для полей заказа и товара.

Либо запрос к товарам а не к покупателям.
Либо запрос к покупателям с агрегацией и сведением количества заказов.
Imho
19 мар 18, 17:09    [21268990]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
Petro123
нет логики в запросе.
не ищи логику, это пример, а не рабочий код, хочешь - в зайцев перепиши.
19 мар 18, 17:25    [21269065]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro
Petro123
нет логики в запросе.
не ищи логику, это пример, а не рабочий код, хочешь - в зайцев перепиши.

А что ее искать, если запрос не к той сущности.
Запрос должен быть логичен, а не джойнить все подряд.
Логично?
19 мар 18, 17:29    [21269088]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
hVostt
А, Core... понятно. Именно EF он ещё очень сырой, при чём настолько, что практически неюзабельно. Половина проекций не работает, группировка? давай досвидания... Миграции, как повезёт вообще, да и не работают толком как в EF 6.
Ну интересно, они что, с нуля его писали? Я полагал, большинство кода взято все-таки с EF6. Ну и не могу же я юзать EF6 под ASP.NET Core.

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


hVostt
советовал бы уйти на другой провайдер, в версии EF Core от него пользы как от козла молока. Ещё годик другой может.
вот это не совсем понял
19 мар 18, 17:29    [21269092]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
Petro123
А что ее искать, если запрос не к той сущности.
Запрос должен быть логичен, а не джойнить все подряд.
Логично?
Не логично, я не буду тратить время, расписывая тебе реальную бизнес-модель полдня. Есть конкретная выборка, которую я хочу получить - два вложенных отношения один-ко-многим, названия сущностей можешь свои подставить, если тебя коробит.
19 мар 18, 17:32    [21269109]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro
два вложенных отношения один-ко-многим,

Сторону Многие сворачиваем через count?
19 мар 18, 17:37    [21269124]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro,

Список чего тебя интересует? Товаров? Заказов? Клиентов?
Может Много ко Много отношения?
19 мар 18, 17:40    [21269138]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
Petro123
Сторону Многие сворачиваем через count?
Да блин, ничего не сворачиваем, я же пример написал на SQL - ты видишь там Count?
В итоге мне нужно загрузить иерархическую модель в дерево.
Я конечно могу написать это ручками тремя запросами послойно, если нет другого выхода, но странно, если его нет.
19 мар 18, 17:42    [21269148]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro
я же пример написал на SQL -
я просил тест к базе и 5 строк результат.
19 мар 18, 17:44    [21269160]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro
Да блин, ничего не сворачиваем, я

Блин! ))))
Если не сворачивать, то запрос к отношению Много!
Т.е. from Заказы!
Так?
19 мар 18, 17:47    [21269177]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Ну или
Right, outer, left, ....чообы null появились.
19 мар 18, 17:50    [21269185]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
Petro123
Т.е. from Заказы!
Какая разница между
FROM Заказы RIGHT JOIN Покупатели и
FROM Покупатели LEFT JOIN Заказы
Если тебе не нравится LEFT JOIN перепиши на RIGHT JOIN - суть не поменяется
Базовая таблица - Покупатели в данном случае
19 мар 18, 17:51    [21269191]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro
Базовая таблица - Покупатели в данном случае

Дело твоё.
Возможно парсер линка не такой крутой как парсер субд.
Чтобы понимать что такое базовая таблица.
Я бы сделал тест в базе. Потом на ef6.
Удачи!
19 мар 18, 17:58    [21269215]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Petro123
hVostt,
Проверить, core виноват или нет, не долго. В демке на ef6.


Чё проверять, я знаю, что представленный код шокером, работает на EF6, без каких-то проблем. Мы пытались заюзать EF Core для небольшого проекта и встретили такую гору проблем, что решили, что пока как-нибудь без него. Взяли даппер.
20 мар 18, 07:59    [21270075]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
Ну интересно, они что, с нуля его писали? Я полагал, большинство кода взято все-таки с EF6. Ну и не могу же я юзать EF6 под ASP.NET Core.

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


Да, пишут с нуля. Потому что решили покрыть не только реляционку, но и NoSQL тоже. И архитектуру внутри решили поменять в корне. Отсюда все грабли :)


Shocker.Pro
вот это не совсем понял


https://github.com/ServiceStack/ServiceStack.OrmLite

Поддерживает Core в полный рост, умеет то, что ты хочешь.
20 мар 18, 08:01    [21270078]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
hVostt
я знаю, что представленный код
у кода выше не буде null в ответах т.к. left join.
Это меня смущает.
А про core звоночки что сырой действительно слышал.
Просто проверять то 3 мин.времени.
20 мар 18, 08:40    [21270146]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
hVostt
https://github.com/ServiceStack/ServiceStack.OrmLite

Поддерживает Core в полный рост, умеет то, что ты хочешь.
Спасибо. То есть ты имел ввиду - заменить сам ОРМ (меня смутило слово провайдер).

Но сейчас так просто прыгнуть не получится, нужно будет переписывать репозиторий, в котором много чего. С EF на Core переделок было минимально, на вот на другой ОРМ перейти щас нет времени.

А что там с миграциями у вас было, не помнишь? Пока тьфу-тьфу, не споткнулся.
20 мар 18, 11:09    [21270641]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
А что там с миграциями у вас было, не помнишь? Пока тьфу-тьфу, не споткнулся


У миграций могут быть проблемы с поддержкой провайдеров. Сложные миграции, типа переименования, изменения связей могут ломаться. Обычные, типа создать таблицу, колонку, работают в принципе :)
20 мар 18, 14:36    [21271507]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
Но сейчас так просто прыгнуть не получится, нужно будет переписывать репозиторий, в котором много чего. С EF на Core переделок было минимально, на вот на другой ОРМ перейти щас нет времени.


Тогда придётся пока костыли впихивать :) Там, где нужны сложные запросы, обходиться либо SELECT N+1, либо писать на чистом SQL и маппить в DTO классы, это он умеет.
20 мар 18, 14:37    [21271511]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Прочитал счас что linq не поддерживает outer join )))
20 мар 18, 15:02    [21271686]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Petro123
Прочитал счас что linq не поддерживает outer join )))


Никогда не поддерживал. Ни сейчас, ни когда-то там. И не планируется.

Решается через группировки.
20 мар 18, 15:22    [21271828]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
Petro123
Прочитал счас что linq не поддерживает outer join )))
Может тебе сначала стоит литературку там почитать, учебники, опыт какой-никакой приобрести, а потом уже консультировать на форуме? А то в каждом топике затычка, а толку в каждом из них - ноль.
20 мар 18, 15:46    [21271925]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro,
Ну дак я учусь. А ты такой злой потому что запрос не работает?
Решение нашел?
20 мар 18, 15:51    [21271951]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
hVostt
Да, пишут с нуля. Потому что решили покрыть не только реляционку, но и NoSQL тоже. И архитектуру внутри решили поменять в корне. Отсюда все грабли :)
Ну в общем, спасибо, что обратил моё внимание на это, я-то исходил, что в EF Core может быть только больше функционала, но никак не меньше, соответственно, были неверные посылы. Сейчас появилось немного времени, поковырялся уже с новой точкой зрения и откопал две вещи:

1) В EF Core нет ленивой загрузки (!)
2) При применении ThenInclude есть косяк в VS - неверно работает Intellisense, соответственно, это меня тоже сбило с толку
Current versions of Visual Studio offer incorrect code completion options and can cause correct expressions to be flagged with syntax errors when using the ThenInclude method after a collection navigation property. This is a symptom of an IntelliSense bug tracked at https://github.com/dotnet/roslyn/issues/8237. It is safe to ignore these spurious syntax errors as long as the code is correct and can be compiled successfully.


В итоге можно просто написать через навигационные свойства
db.Customers
  .Include(n => n.Orders)
  .ThenInclude(n => n.Goods)
  .Where(n => n.Id == id)

Все равно через ж, потому что проекция не работает, точнее сгенерит N*M+1 запрос, но хотя бы можно материализовать и потом спроецировать. Запрос к БД при этом тоже интересно, получается три запроса -
Customers
Orders Inner Join Customers
Goods InnerJoin Orders Inner Join Customers
И фильтр пробрасывается во все три запроса, в результате получается-таки LEFT JOIN.
Ну это хотя бы не N*M+1 запрос.
И группировка не работает.
Да, полное овно.
Я офигел, честно говоря. Был же продукт. Ну пилили бы другой с другим названием с нуля, зачем ломать старый-то, революционеры хреновы.
25 мар 18, 22:23    [21284703]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
hVostt
https://github.com/ServiceStack/ServiceStack.OrmLite

Поддерживает Core в полный рост, умеет то, что ты хочешь.
Посмотрел овервью, да, похоже вещь сделана для людей и руками, а не жо-ой.

Даже есть SelectFilter на таблицу, то что я руками пилил в своем RepositoryBase поверх EF.

Ты вообще с этой штукой работал, понравилось?

И я правильно понял:
1) Аналога трекера там нет, то есть встроить дополнительную модификацию объектов перед общим сбросом в БД не получится?
2) Про автоматическое изменение схемы БД тоже ничего толком не нашел - все миграции ручками?
25 мар 18, 22:30    [21284712]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
Ты вообще с этой штукой работал, понравилось?


Использовал в проектах, где требовался полный контроль над СУБД и LINQ, понравилось :)


Shocker.Pro
1) Аналога трекера там нет, то есть встроить дополнительную модификацию объектов перед общим сбросом в БД не получится?


Нет, здесь смысл в том, что ты сам формируешь изменения, при необходимости групповые (чего нет в EF по факту и не может быть). По поводу трекинга вопрос, конечно в определённых случаях трекинг отличное решение, но по опыту, на перспективу не очень. При развитии проекта трекинг больше мешает, чем помогает. Хотя никто не мешает сделать его там, где это необходимо с помощью DynamicProxy / Observable, или вообще через Event Sourcing.


Shocker.Pro
2) Про автоматическое изменение схемы БД тоже ничего толком не нашел - все миграции ручками?


Ну не совсем прям ручками.

Во-первых, https://www.codeproject.com/Articles/1197504/How-to-use-code-first-and-data-migration-with-Serv

Во-вторых, это редкий случай, когда ORM содержит поддержку DDL, так что можно абстрагироваться от СУБД и писать миграции на более высоком уровне.

В общем, тут целиком зависит от задач и от личных предпочтений в работе с данными. С учётом того, что на Core вменяемого решения ещё ждать минимум пару лет, стоит задуматься о других решениях.

По крайне мере в OrmLite есть поддержка LINQ, DDL и достаточный уровень абстракции, чтобы задействовать типизацию и при этом иметь контроль над данными.
25 мар 18, 22:53    [21284730]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
1) В EF Core нет ленивой загрузки (!)


Это вообще жесть, один из основных причин, держать его пока подальше от продакшена.
25 мар 18, 22:55    [21284733]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
Я офигел, честно говоря. Был же продукт. Ну пилили бы другой с другим названием с нуля, зачем ломать старый-то, революционеры хреновы.


Ну чё, нашли фатальный недостаток, нормально :)
25 мар 18, 22:56    [21284734]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
var dbFactory = new OrmLiteConnectionFactory(
    ":memory:", SqliteDialect.Provider);
using (IDbConnection db = dbFactory.Open())
{
    db.DropAndCreateTable<Todo>();
    var todo = new Todo
    {
        Content = "Learn OrmLite",
        Order = 1,
    };

    db.Save(todo);

    var savedTodo = db.SingleById<Todo>(todo.Id);
    savedTodo.Content = "Updated";
    db.Save(savedTodo);

    "Updated Todo:".Print();
    db.Select<Todo>(q => q.Content == "Updated").PrintDump();
                
    db.DeleteById<Todo>(savedTodo.Id);

    "No more Todos:".Print();
    db.Select<Todo>().PrintDump();
}
25 мар 18, 23:00    [21284741]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
hVostt
Во-вторых, это редкий случай, когда ORM содержит поддержку DDL, так что можно абстрагироваться от СУБД и писать миграции на более высоком уровне.
А можешь пояснить? Тут не догнал.

hVostt
Ну чё, нашли фатальный недостаток, нормально :)
Да ну, тут ты гонишь - его же они сами и писали
25 мар 18, 23:25    [21284768]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
hVostt
Во-вторых, это редкий случай, когда ORM содержит поддержку DDL, так что можно абстрагироваться от СУБД и писать миграции на более высоком уровне.
А можешь пояснить? Тут не догнал.


Ну вот же

db.DropAndCreateTable<Todo>();




оформляешь в миграции, и хранишь как тебе надо, мне кстати нравится как это сделано в EF6
25 мар 18, 23:37    [21284783]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
А данные?
25 мар 18, 23:50    [21284791]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
А данные?


Ну Create/Update... )) Ты же про посев?
26 мар 18, 07:46    [21284952]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro,
Не придираясь, исключительно для уточнения наезда на Core:
1) как решил что ленивая не работает?
2) базовую таблицу from не пробовал сменить?
3) запросы сразу к трем таблицам Много ко Много вполне могут допилить позже. Они не каждодневные и больше не к ОРМ идут а к отчетникам и аналитикам.
Imho
26 мар 18, 08:42    [21285011]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
В тему, смена синтаксиса при переходе на Core с EF6.
https://stackoverflow.com/questions/40319251/using-ef-core-theninclude-on-junction-tables
26 мар 18, 09:12    [21285064]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
hVostt
Shocker.Pro
А данные?


Ну Create/Update... )) Ты же про посев?
Я вообще про апгрейды, развертывание в том числе.

Если в EF я просто занимаюсь разработкой могу несколько раз поменять модель и когда пришло время, миграция сгенерилась автоматически, то тут я должен менять модель и сам ручками параллельно делать как миграцию (следя за тем, чтобы она оставалась синхронной с моделью), так и поддерживать версионность схемы БД, если я не работаю напрямую с продакшен базой, а предполагаю, что схема должна обновляться у клиента в автоматическом режиме. Так?
26 мар 18, 09:33    [21285158]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
Petro123
1) как решил что ленивая не работает?
https://docs.microsoft.com/en-us/ef/core/querying/related-data
Petro123
2) базовую таблицу from не пробовал сменить?
?
Petro123
3) запросы сразу к трем таблицам Много ко Много вполне могут допилить позже.

Это мне пока не требовалось от Core, с другой стороны, я и не использовал М:М возможности и в EF.NET, создавал таблицу связок вручную.
Petro123
Они не каждодневные и больше не к ОРМ идут а к отчетникам и аналитикам.
Теоретик, блин
26 мар 18, 09:39    [21285184]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro
Petro123
2) базовую таблицу from не пробовал сменить?
?

Много ко многим: покупатели <--> товары
Так?
26 мар 18, 09:55    [21285242]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
Если в EF я просто занимаюсь разработкой могу несколько раз поменять модель и когда пришло время, миграция сгенерилась автоматически, то тут я должен менять модель и сам ручками параллельно делать как миграцию (следя за тем, чтобы она оставалась синхронной с моделью), так и поддерживать версионность схемы БД, если я не работаю напрямую с продакшен базой, а предполагаю, что схема должна обновляться у клиента в автоматическом режиме. Так?


Всё верно. Все миграции писать ручками, завести служебную таблицу миграций (чтобы поддерживать схему БД), написать механизм миграций.
26 мар 18, 09:58    [21285250]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro
Petro123
Они не каждодневные и больше не к ОРМ идут а к отчетникам и аналитикам.
Теоретик, блин
я сказал общеизвестную вещь....и не обиделся на ответ).
26 мар 18, 09:58    [21285252]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Petro123
Shocker.Pro
пропущено...
?

Много ко многим: покупатели <--> товары
Так?

Идем далее логически.
Много ко многим решается через промежуточную таблицу. Третью.
Если текст запроса такой: "Дай мне все заказы с тем то тем то", то базовая (твой термин) таблица это from заказы.
Т.е. если результать больше чем строк в Покупатели, то from не на покупателя.
Похожий твой случай?
26 мар 18, 10:47    [21285437]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro
Это мне пока не требовалось от Core, с другой стороны, я и не использовал М:М возможности и в EF.NET, создавал таблицу связок вручную.

Может в этом все дело. В ручном подходе.
Либо подход DbFirst(как я предпочитаю).
Либо CodeFirst и смотреть что там MS в базе нагенерил.
Что то посередине и руками, ...я бы не.
Зы.
Ссылку посмотрю.
26 мар 18, 11:25    [21285637]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
hVostt
Всё верно. Все миграции писать ручками, завести служебную таблицу миграций (чтобы поддерживать схему БД), написать механизм миграций.
А где смайлик?
А есть какая-нить ОРМ, которая поддерживает автоматическую генерацию миграций, помимо EF?
26 мар 18, 12:28    [21285898]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
Petro123,

Все твои сообщения говорят о том, что дальше Hello World с БД, SQL и данными тебе работать не приходилось, так что извини, отвечать на тво бредовые вопросы желания никакого нет. Если ты хотя бы примеры кода приводил, я бы мог указать на твои ошибки, но ты занимаешься просто бла-бла. Было бы пофиг, если бы ты свои флудом не занимал бы больше половины топика, забивая нормальный диалог. Поэтому постарайся просто помолчать, если уж совсем не терпится, напиши код, проверь его, тогда уже можно будет о чем-то говорить.
26 мар 18, 12:34    [21285913]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro,
Опять бла бла бла.
Твой подход, это linq, а не ОРМ по твоим словам:
автор
я и не использовал М:М возможности и в EF.NET, создавал таблицу связок вручную.

Не хочешь развиваться, твое право.
Удачи!
26 мар 18, 12:49    [21285976]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
hVostt
Всё верно. Все миграции писать ручками, завести служебную таблицу миграций (чтобы поддерживать схему БД), написать механизм миграций.
А где смайлик?
А есть какая-нить ОРМ, которая поддерживает автоматическую генерацию миграций, помимо EF?


Зачем смайлик? :)

В текущей системе у нас миграции не просто автоматические, они полностью динамические, таблицы, связи, констрейты, индексы создаются на лету во время исполнения программы, аналитик описывает модели на DDL прям в приложении, это отражается в БД. Мы систему runtime-миграции написали сами, на EF мы бы ничего подобного даже близко не сделали никогда. Поэтому, я серьёзно. Собственные миграции, это айс :)

В общем, смотри сам. Попробуй пожить с EF :) Может сможешь как-то закостылить узкие места до лучших времён. У нас есть маленький проектик на EF Core, ничо, живёт.
26 мар 18, 19:22    [21287614]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
hVostt
аналитик описывает модели на DDL


*DML
26 мар 18, 19:22    [21287618]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
Ну динамика - это отдельная песня, то понятно.
Но в статике-то хотелось больше сервиса, иначе полностью теряется преимущество CodeFirst и проще использовать DBFirst, чтобы не писать два раза одно и то же.
26 мар 18, 19:51    [21287671]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
Ну динамика - это отдельная песня, то понятно.
Но в статике-то хотелось больше сервиса, иначе полностью теряется преимущество CodeFirst и проще использовать DBFirst, чтобы не писать два раза одно и то же.


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

Да, удобно, но не более. За день-два можно написать неплохой механизм миграций для своего проекта. Ну и допиливать его по мере необходимости.
26 мар 18, 20:27    [21287721]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Shocker.Pro
и проще использовать DBFirst, чтобы не писать два раза одно и то же.


Ну, возможно... Я уже сто лет как не разрабатываю ПО через БД, это фигня какая-то ))
26 мар 18, 20:29    [21287725]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
hVostt
через БД, это фигня какая-то ))
а аналитики пишут (РИСУЮТ) Модель в DDL.)))
Неувязочкасс)).
26 мар 18, 22:32    [21287911]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19544
Petro123
hVostt
через БД, это фигня какая-то ))
а аналитики пишут (РИСУЮТ) Модель в DDL.)))
Неувязочкасс)).
Мальчик-писатель-не-читатель!
угомонись уже
26 мар 18, 22:50    [21287971]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35609
Shocker.Pro,
Тебя плохо воспитывали? К другим приставать?
26 мар 18, 23:13    [21288044]     Ответить | Цитировать Сообщить модератору
 Re: EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN  [new]
hVostt
Member

Откуда:
Сообщений: 14972
Petro123
а аналитики пишут (РИСУЮТ) Модель в DDL.)))
Неувязочкасс)).


Ну зависит от степени автоматизации. В допотопных конторах пусть аналитики фигачат DDL ))
27 мар 18, 16:23    [21290574]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить