2010-05-10 2 views
3

데이터베이스의 레코드 당 최대 세 개의 광고 항목을 저장하는 OMS를 사용하고 있습니다.LINQ 정규화 데이터

다음은 5 개의 광고 항목이 포함 된 광고 주문의 예입니다.

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

하나의 주문 헤더 레코드와 두 개의 상세 레코드.

내 목표는 세부 레코드 (예 : 광고 항목 당 하나의 세부 레코드)에 대해 일대일 관계입니다. 과거에는 SQL 문을 사용하여 데이터를 추출했습니다. 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 }); 
+0

'E ... _ 00n' 이름이 그 형태로 고정되어 있습니까? 세 개 미만인 경우 어떻게됩니까? 'null' 값은? – tzaman

+0

예, 테이블 열은 _00n으로 고정되어 있습니다. 스키마는 데이터 형식을 배열로 지원하는 HPe3000 IMAGE 데이터베이스에서 마이그레이션되었습니다. 항목 수준 세부 정보가 배열에 저장되었습니다. 광고 항목이 하나만있는 경우 다른 두 값의 항목 ID는 0입니다. 가격과 수량도 마찬가지입니다. 널 (null) 값의 가능성은 없습니다. 열의 기본값은 0 또는 공백입니다. 이 모든 것을 뒷받침하는 이유는 하루 안에 공간을 절약하기 위해서였습니다. 디자이너는 주문에 가장 많은 수의 광고 항목을 가져 와서 주문 세부 스키마를 만들었습니다. 감사합니다. Brennan –

답변

1

이드 위에 방금 루프 그리고 간단한 하위 클래스

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이 아님.

+0

데이터베이스 스키마를 언급하고 있습니까? –