написание запроса Linq-to-Entities - PullRequest
1 голос
/ 14 ноября 2011

Я новичок в LINQ и Entity Framework и застрял на конкретном запросе, который я пытаюсь написать.У меня есть база данных со структурой ниже.Для простоты я только что включил файлы и поля, которые имеют отношение к проблеме.

Table: SCMPOFILE
Columns: 
POKEY
PONUMBER
...


Table: SCMSKUFILE
SKUKEY
POKEY - Foreign Key on SCMPOFILE.POKEY
.....


Table: SCMSHPMAST
SHIPKEY
DELIVERYDATE
.....


Table: SCMSHIPPINGDETAIL
SHPDTLKEY
SHIPKEY  - Foreign Key on SCMSHPMAST.SHIPKEY
POKEY - Foreign Key on SCMPOFILE.POKEY
SKUKEY - Foreign Key on SCMSKUFILE.SKUKEY
......

Как видно из структуры, у 1 ключа отгрузки может быть несколько ключей отгрузки. Аналогично, каждый заказ на поставкуи с sku может быть связано несколько ключей отгрузки.

Я пытаюсь найти все skus (SCMSKUFILEs), где SCMSHPMAST.DELIVERYDATE не равен NULL.Поскольку я определил внешние ключи, сгенерированная модель автоматически объединяет SCMSHIPPINGDETAIL с каждым связанным с ним SCMSKUFILE (и SCMSHPMAST, присоединенным к каждому SCMSHIPPINGDETAIL).Я могу делать объединения для всех отдельных файлов, чтобы получить желаемые результаты, но я хочу использовать для этого LINQ и модель, созданную структурой сущностей.

Я пытаюсь сделать что-то вроде этого: - Выбрать все SCMSKUFILE, где SCMSHIPPINGDETAILs имеет SCMSHPMAST с DELIVERYDATE, не равным нулю.

Это можно сделать с помощью одного запроса LINQ?Я много почесал голову, но не могу написать запрос LINQ.

Надеюсь, я правильно объяснил свою проблему.Пожалуйста, дайте мне знать, если я что-то пропустил?

Спасибо, Абхи.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2011

Не глядя слишком глубоко на структуру ваших таблиц, похоже, что вы ищете запрос, который ограничивает родительские результаты (SCMSKUFILE) на основе свойств некоторых их дочерних элементов (DELIVERYDATE не равен нулю). LINQ использует квантификаторы «Any» и «All» для выражения таких запросов, например:

edm.Parents.Where(p => p.Children.Any(c => c.DeliveryDate != null));

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

0 голосов
/ 14 ноября 2011

Вы пробовали что-то подобное?

var results = SCMSKUFILEs.Where(a => a.SCMSHIPPINGDETAILs.Any(d => d.SHIPMASTs.Any(m => m.DELIVERYDATE != null)));

Не уверен, что у меня на макушке, если это будет стоить чёртово вложенных ЛЮБОЙ, но стоит попробовать.* Вы могли бы также пойти с другого направления, что-то вроде этого ...

var results = SHIPMASTs.Where(m => m.DELIVERYDATE != null)
    .SelectMany(m => m.SCMSHIPPINGDETAILs)
    .SelectMany(d => d.SCMSKUFILEs)
    .Distinct();
...