powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF Core 5 Multiple relations
3 сообщений из 3, страница 1 из 1
EF Core 5 Multiple relations
    #40093892
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Есть MSSQL БД под системой Navision (она ей рулит).
Физических FK в БД нет, они все на уровне приложения Navision.
Есть такая структура таблиц (Из коробки от самого Microsoft):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE [Company$Item Ledger Entry](
	[Entry No_] [int] NOT NULL, -- PK
	[Document No_] [varchar](20) NOT NULL,
	[Document Type] [int] NOT NULL
....
)

CREATE TABLE [Company$Purch_ Rcpt_ Header](
	[No_] [varchar](20) NOT NULL -- PK
....
)

CREATE TABLE [Company$Sales Shipment Header](
	[No_] [varchar](20) NOT NULL -- PK
....
)



В поле [Document No_] таблицы [Company$Item Ledger Entry] могут лежать значения [No_] как из [Company$Purch_ Rcpt_ Header], так и из [Company$Sales Shipment Header] (Всего 15 таблиц). Поле [Document Type] по сути обозначает какой номер документа из какой таблицы там лежит.

Поэтому справедлив запрос..
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT
  ile.[Entry No_],
  ile.[Document No_],
  ile.[Document Type],
  COALESCE(pih.No_, ssh.No_) AS No_,
  pih.No_,
  ssh.No_
FROM
  [Company$Item Ledger Entry] AS ile
  LEFT JOIN [Company$Purch_ Inv_ Header] AS pih
    ON pih.No_ = ile.[Document No_] AND
       ile.[Document Type] = 5
  LEFT JOIN [Company$Sales Shipment Header] AS ssh
    ON ssh.No_ = ile.[Document No_] AND
       ile.[Document Type] = 1



Есть ли возможность используя навигации воссоздать такой запрос через Include/ThenInclude. Хотя бы для одного LEFT JOIN.
Воссоздать LEFT JOIN у меня получилось (при этом логически гарантируется, что номера документов уникальные в системе (но это всего лишь настройки)), а вот чтобы автоматически да и даже в запросе дополнительно указать Document Type для левого соединения не получается

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class ItemLedgerEntry
    {
        public Int32 EntryNo { get; set; }
        public String DocumentNo { get; set; }
        public Int32 DocumentType { get; set; }
        public PurchRcptHeader PurchRcptHeader { get; set; }
    }

builder
                .HasOne(c => c.PurchRcptHeader)
                .WithMany()
                .HasForeignKey(c => c.DocumentNo)
                .OnDelete(DeleteBehavior.NoAction)
                .IsRequired(false);




Суть, чтобы была возможность использовать трекинг объектов, и при этом иметь условные связи.
Что-то вроде этого:
Код: c#
1.
.WithMany(c => c.ItemLedgerEntries.Where(x => x.DocumentType == 5))


Или по другому нужен условный Include/ThenInclude но не на коллекцию, а на объект

Как это сделать через SelectMany подставляя DBSet<> понятно (и то, там генерируется OUTER APPLY вместо LEFT JOIN, но на результат это не влияет), но на выходе будет совсем не исходный DBSet<>
...
Рейтинг: 0 / 0
EF Core 5 Multiple relations
    #40094913
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если через навигационные свойства не получается сделать запрос, можно попробовать описать джойны напрямую. Благо EF это позволяет. Complex Query Operators , Perform custom join operations .

Вообще, EF (Core) весьма убог в плане составления сложных запросов. Вот здесь: EF Core Tools & Extensions - можно поискать дополнения, которые добавят ему мощи.

Судя по описанию, ELinq позволяет писать запросы как в SQL. Но с этой либой я никогда не работал, поэтому ничего по ней не скажу.

Зато могу посоветовать linq2db.EntityFrameworkCore . Примеры разных джойнов: Joins .

Если последние примеры заинтересуют, то я бы посоветовал выкинуть EF и взять ORM linq2db. Но почему-то такое предложение всегда вызывает отторжение... Странно: никто не возражает против подключения дополнительных библиотек, например, для парсинга форматов наподобие json, yaml, csv, для графических компонентов, для всяких REST и SOAP-клиентов, а вот как предложишь доп либу для ORM - сразу паника. Из моего личного опыта...
...
Рейтинг: 0 / 0
EF Core 5 Multiple relations
    #40094921
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvik
Но почему-то такое предложение всегда вызывает отторжение...

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


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