Entity Framework: перезагрузить все дочерние объекты из запроса на основе атрибутов дочерних объектов - PullRequest
1 голос
/ 21 декабря 2010

Есть ли способ элегантно загрузить все дочерние объекты объекта EF, если экземпляр объекта был загружен в результате запроса атрибутов дочернего объекта?Вот простой пример того, что я спрашиваю:

Во-первых, несколько простых таблиц данных:

CREATE TABLE Invoices
(
    InvoiceID int IDENTITY(1000,1) NOT NULL,
    Customer nvarchar(50) NOT NULL,
    InvoiceDate datetime NOT NULL,
    CONSTRAINT PK_Invoices PRIMARY KEY (InvoiceID)
)

CREATE TABLE InvoiceItems
(
    InvoiceItemID int IDENTITY(1,10) NOT NULL,
    InvoiceFK int NOT NULL,
    PurchasedItem varchar(24) NULL,
    Quantity decimal(10,2) NULL,
    ItemPrice money NULL,
    CONSTRAINT PK_InvoiceItems PRIMARY KEY (InvoiceItemID),
    CONSTRAINT FK_InvoiceItems_Invoice FOREIGN KEY (InvoiceFK)
        REFERENCES Invoices (InvoiceID)
)

Теперь нам нужно запросить таблицу счетов на основе соответствующего счета-фактуры.пункт, но затем показать все элементы для каждого выбранного счета-фактуры, независимо от того, соответствует ли он критериям:

var qryOrders = from ordr in ctx.InvoiceItems
                .Include("Invoice")
                where ordr.PurchasedItem == "Buggy Whips"
                select ordr;

foreach (var ordrItm in qryOrders)
{
    Console.WriteLine("Order " + ordrItm.Invoice.InvoiceID + " contains buggy whips");
    Console.WriteLine("Full contents of order:");

    foreach (var itm in ordrItm.Invoice.InvoiceItems)
    {
        //this will only show the buggy whip item
        Console.WriteLine(itm.PurchasedItem);
    }
}

Я хочу показать все элементы заказа в каждом заказе, который содержит «Багги Кнуты», включая элементыэто не глючные кнуты.Если бы я писал это на SQL, я бы использовал предложение WHERE InvoiceID IN () с подзапросом.Мой вопрос: может ли Entity Framework сделать это элегантным образом?Я придумала несколько хаков, которые работают, но ничего плохого.

1 Ответ

0 голосов
/ 21 декабря 2010

Довольно запутанный вопрос - но я попытаюсь ответить на это утверждение:

Я хочу показать все элементы заказа в каждом заказе, которые содержат «багги-кнуты», включая элементы, которые не являются багги-кнутами.

Я думаю, вам нужно перевернуть InvoiceItems / Invoice:

var query = ctx.Invoices.Include("InvoiceItems")
               .Where(x => x.InvoiceItems.Any(y => y.PurchasedItem == "Buggy Whips"))
               .Select(x => x.Invoices);

Этот запрос вернет коллекцию из Invoices, у которой на найден хотя бы один купленный предмет "Buggy Whips".

Если вы хотите вернуть коллекцию Invoices, где все приобретенных предметов - "Багги Кнут", замените .Any на .All.

Не уверен, что это то, что вам нужно.

Часть, которая меня смущает, такова:

Если бы я писал это на SQL, я бы использовал предложение WHERE InvoiceID IN () с подзапросом

InvoiceID находится в таблице Invoices, но имя элемента (PurchasedItem) находится в таблице InvoiceItems - так как это будет работать?

Возможно, если бы вы написали пример SQL-запроса, мы могли бы помочь вам преобразовать его в LINQ-Entities.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...