powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
25 сообщений из 65, страница 2 из 3
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39617177
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНу интересно, они что, с нуля его писали? Я полагал, большинство кода взято все-таки с EF6. Ну и не могу же я юзать EF6 под ASP.NET Core.

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

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


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

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

Поддерживает Core в полный рост, умеет то, что ты хочешь.
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39617201
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttя знаю, что представленный коду кода выше не буде null в ответах т.к. left join.
Это меня смущает.
А про core звоночки что сырой действительно слышал.
Просто проверять то 3 мин.времени.
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39617328
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt https://github.com/ServiceStack/ServiceStack.OrmLite

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

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

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

У миграций могут быть проблемы с поддержкой провайдеров. Сложные миграции, типа переименования, изменения связей могут ломаться. Обычные, типа создать таблицу, колонку, работают в принципе :)
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39617569
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНо сейчас так просто прыгнуть не получится, нужно будет переписывать репозиторий, в котором много чего. С EF на Core переделок было минимально, на вот на другой ОРМ перейти щас нет времени.

Тогда придётся пока костыли впихивать :) Там, где нужны сложные запросы, обходиться либо SELECT N+1, либо писать на чистом SQL и маппить в DTO классы, это он умеет.
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39617590
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал счас что linq не поддерживает outer join )))
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39617619
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Прочитал счас что linq не поддерживает outer join )))

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

Решается через группировки.
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39617636
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Прочитал счас что linq не поддерживает outer join )))Может тебе сначала стоит литературку там почитать, учебники, опыт какой-никакой приобрести, а потом уже консультировать на форуме? А то в каждом топике затычка, а толку в каждом из них - ноль.
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39617640
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Ну дак я учусь. А ты такой злой потому что запрос не работает?
Решение нашел?
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620222
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.

В итоге можно просто написать через навигационные свойства
Код: c#
1.
2.
3.
4.
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 запрос.
И группировка не работает.
Да, полное овно.
Я офигел, честно говоря. Был же продукт. Ну пилили бы другой с другим названием с нуля, зачем ломать старый-то, революционеры хреновы.
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620227
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt https://github.com/ServiceStack/ServiceStack.OrmLite

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

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

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

И я правильно понял:
1) Аналога трекера там нет, то есть встроить дополнительную модификацию объектов перед общим сбросом в БД не получится?
2) Про автоматическое изменение схемы БД тоже ничего толком не нашел - все миграции ручками?
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620230
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТы вообще с этой штукой работал, понравилось?

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


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

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


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

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

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

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

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

По крайне мере в OrmLite есть поддержка LINQ, DDL и достаточный уровень абстракции, чтобы задействовать типизацию и при этом иметь контроль над данными.
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620231
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro1) В EF Core нет ленивой загрузки (!)

Это вообще жесть, один из основных причин, держать его пока подальше от продакшена.
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620232
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ офигел, честно говоря. Был же продукт. Ну пилили бы другой с другим названием с нуля, зачем ломать старый-то, революционеры хреновы.

Ну чё, нашли фатальный недостаток, нормально :)
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620233
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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();
}
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620239
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВо-вторых, это редкий случай, когда ORM содержит поддержку DDL, так что можно абстрагироваться от СУБД и писать миграции на более высоком уровне.А можешь пояснить? Тут не догнал.

hVosttНу чё, нашли фатальный недостаток, нормально :)Да ну, тут ты гонишь - его же они сами и писали
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620241
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProhVosttВо-вторых, это редкий случай, когда ORM содержит поддержку DDL, так что можно абстрагироваться от СУБД и писать миграции на более высоком уровне.А можешь пояснить? Тут не догнал.

Ну вот же

Код: c#
1.
db.DropAndCreateTable<Todo>();





оформляешь в миграции, и хранишь как тебе надо, мне кстати нравится как это сделано в EF6
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620243
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А данные?
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620295
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА данные?

Ну Create/Update... )) Ты же про посев?
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620310
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Не придираясь, исключительно для уточнения наезда на Core:
1) как решил что ленивая не работает?
2) базовую таблицу from не пробовал сменить?
3) запросы сразу к трем таблицам Много ко Много вполне могут допилить позже. Они не каждодневные и больше не к ОРМ идут а к отчетникам и аналитикам.
Imho
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620318
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В тему, смена синтаксиса при переходе на Core с EF6.
https://stackoverflow.com/questions/40319251/using-ef-core-theninclude-on-junction-tables
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620333
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttShocker.ProА данные?

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

Если в EF я просто занимаюсь разработкой могу несколько раз поменять модель и когда пришло время, миграция сгенерилась автоматически, то тут я должен менять модель и сам ручками параллельно делать как миграцию (следя за тем, чтобы она оставалась синхронной с моделью), так и поддерживать версионность схемы БД, если я не работаю напрямую с продакшен базой, а предполагаю, что схема должна обновляться у клиента в автоматическом режиме. Так?
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620339
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro1231) как решил что ленивая не работает? https://docs.microsoft.com/en-us/ef/core/querying/related-data
Petro1232) базовую таблицу from не пробовал сменить??
Petro1233) запросы сразу к трем таблицам Много ко Много вполне могут допилить позже.
Это мне пока не требовалось от Core, с другой стороны, я и не использовал М:М возможности и в EF.NET, создавал таблицу связок вручную.Petro123Они не каждодневные и больше не к ОРМ идут а к отчетникам и аналитикам.Теоретик, блин
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620351
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProPetro1232) базовую таблицу from не пробовал сменить??
Много ко многим: покупатели <--> товары
Так?
...
Рейтинг: 0 / 0
EF: Как грамотно написать на LINQ запрос для EF с двумя или более LEFT JOIN
    #39620352
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЕсли в EF я просто занимаюсь разработкой могу несколько раз поменять модель и когда пришло время, миграция сгенерилась автоматически, то тут я должен менять модель и сам ручками параллельно делать как миграцию (следя за тем, чтобы она оставалась синхронной с моделью), так и поддерживать версионность схемы БД, если я не работаю напрямую с продакшен базой, а предполагаю, что схема должна обновляться у клиента в автоматическом режиме. Так?

Всё верно. Все миграции писать ручками, завести служебную таблицу миграций (чтобы поддерживать схему БД), написать механизм миграций.
...
Рейтинг: 0 / 0
25 сообщений из 65, страница 2 из 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]