Линк-Sql Много-Один отношения - PullRequest
2 голосов
/ 13 октября 2009

У меня есть два вида настройки SQL:

  • PurchaseOrder
  • PurchaseOrderLineItems

У них много псевдонимов столбцов (таблицы, которые они просматривают / объединяют, не имеют разумного названия ... это сторонний продукт)

У меня есть 2 класса (упрощенно ниже)

    class PurchaseOrder
    {
        public string PoNumber { get; set; }
        public string Vendor { get; set; }
        public DateTime DateCreated { get; set; }

        public IEnumerable<PurchaseOrderLineItems> LineItems { get; set; }
    }

и

    class PurchaseOrderLineItems
    {
       public string PoNumber { get; set; }
       public string Name { get; set; }
       public double Price { get; set; }
    }

Я использую Linq to Sql - с файлом сопоставления XML (создан с помощью sqlmetal.exe)

Что я хочу сделать, так это эффективно заполнить IEnumerable в PurchaseOrder записями из представления PurchaseOrderLineItem - эффективно объединяя таблицы

Я хотел сделать это, используя POCO - без необходимости добавлять EntitySet <> в мой класс, так как в конце концов я заменил свой ORM на что-то вроде nHibernate (с атрибутом bag, который я считаю ...?)

В настоящее время у меня есть хранимая процедура - sp_getPurchaseOrderLineItems, которая принимает PONumber, а затем возвращает список объектов PurchaseOrderLineItem, которые я затем добавляю в свой набор результатов (это далеко, далеко от идеала)

есть ли способ сделать то, что мне нужно? Так что, по сути, запрос на PurchaseOrder возвращает уже заполненный IEnumerable из LineItems в экземпляре?

Стоит отметить, что это будет только для чтения, мы никогда не будем вставлять / обновлять данные, используя это.

Ответы [ 2 ]

2 голосов
/ 13 октября 2009

Вы можете расширить свой класс PurchaseOrder для реализации OnLoadedMethod:

public partial class PurchaseOrder 
{
    partial void OnLoaded()
    {
        LineItems = FunctionToCall_sp_getPurchaseOrderLineItems_AndBuildSet();
    }
}

Это как минимум автоматически получит позиции, когда вы получите свой заказ.

0 голосов
/ 13 октября 2009

Это проблема n + 1. У nHibernate есть решение для этого, которое называется запросом join-fetch. В основном он выполняет запрос на внешнее соединение между порядком и строкой заказа, в результате чего получается произведение количества строк в двух таблицах.

Я не думаю, что у Linq2SQL есть решение для этого. Но вы все равно можете использовать свою хранимую процедуру для генерации выходных данных join-fetch и иметь некоторый код Linq2Objects для различения уникальных заказов и строк заказа из результата.

...