LINQ нормализация данных - PullRequest
3 голосов
/ 10 мая 2010

Я использую OMS, которая хранит до трех позиций на запись в базе данных.

Ниже приведен пример заказа, содержащего пять позиций.

Order Header
Order Detail
   Prod 1
   Prod 2
   Prod 3
Order Detail
   Prod 4
   Prod 5

Одна запись заголовка заказа и две подробные записи.

Моя цель - иметь отношение один к одному для подробных записей (то есть одна подробная запись на позицию) В прошлом я использовал оператор SQL UNION ALL для извлечения данных. Есть ли лучший подход к этой проблеме с использованием LINQ?

Ниже приведена моя первая попытка использования LINQ. Любые отзывы, предложения или рекомендации будут с благодарностью. Из того, что я прочитал, заявление UNION может облагать налогом процесс?

var orderdetail =
    (from o in context.ORDERSUBHEADs
        select new { 
            edpNo = o.EDPNOS_001, price = o.EXTPRICES_001, 
            qty = o.ITEMQTYS_001 }
    ).Union(from o in context.ORDERSUBHEADs
        select new { edpNo = o.EDPNOS_002, price = o.EXTPRICES_002, 
            qty = o.ITEMQTYS_002 }
    ).Union(from o in context.ORDERSUBHEADs
        select new { edpNo = o.EDPNOS_003, price = o.EXTPRICES_003, 
            qty = o.ITEMQTYS_003 });

1 Ответ

1 голос
/ 11 мая 2010

Id построить простой подкласс

class Record 
{
    public object SubHeading { get; set; }
    public int EdpNo { get; set; }
    public decimal Price { get; set; }
    public int Quantity { get; set; }
}

Тогда вы просто зацикливаетесь на этом

var orders = context.ORDERSUBHEADs.Select(o => 
   new Record[] {
      new Record { SubHeading = o, EdpNo = o.EDPNOS_001, Price = o.EXTPRICES_001, Quantity = o.ITEMQTYS_001 },
      new Record { SubHeading = o, EdpNo = o.EDPNOS_002, Price = o.EXTPRICES_002, Quantity = o.ITEMQTYS_002 },
      new Record { SubHeading = o, EdpNo = o.EDPNOS_003, Price = o.EXTPRICES_003, Quantity = o.ITEMQTYS_003 }
   }
);

IEnumerable allOrders = IEnumerable.Empty;
foreach(Record[] r in orders)
    allOrders = allOrders.Concat(r);

IEnumerable allRecords = allOrders.Cast<Record>();

Но, откровенно говоря, ваша o структура - отстой, вы должны построить список элементов как IEnumerable или IList или как-то, а не #Parameters * #Rows.

...