2010-05-10 5 views
3

J'utilise un OMS qui stocke jusqu'à trois éléments de ligne par enregistrement dans la base de données.LINQ Normaliser les données

Voici un exemple d'une commande contenant cinq éléments de ligne.

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

Un enregistrement d'en-tête de commande et deux enregistrements de détail.

Mon but est d'avoir une relation un-à-un pour les enregistrements de détails (c'est-à-dire, un enregistrement de détail par élément de ligne). Dans le passé, j'ai utilisé une instruction SQL UNION ALL pour extraire les données. Y a-t-il une meilleure approche à ce problème en utilisant LINQ?

Voici ma première tentative d'utilisation de LINQ. Tous les commentaires, suggestions ou recommandations seraient grandement appréciés. Pour ce que j'ai lu, une déclaration UNION peut taxer le processus?

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

Les noms 'E ..._ 00n' sont-ils fixés sous cette forme? Et que se passe-t-il s'il y en a moins de trois? valeurs null? – tzaman

+0

Oui, les colonnes des tables sont fixées avec _00n. Le schéma a été migré à partir d'une base de données HPe3000 IMAGE prenant en charge les types de données sous la forme de tableaux. Le détail au niveau de l'article était stocké dans des tableaux. Si un seul élément de ligne est présent, l'ID d'élément pour les deux autres valeurs sera zéro. La même chose s'applique au prix et à la quantité. Il n'y a aucune chance pour une valeur nulle. Les colonnes ont des valeurs par défaut de zéro ou d'espaces. Le raisonnement derrière tout cela était de gagner de la place dans la journée. Les concepteurs ont pris le nombre le plus commun d'éléments de campagne sur une commande et créé le schéma de détail de la commande. Merci, Brennan –

Répondre

1

Id construire simple sous-classe

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

Alors vous venez de boucle au-dessus tout

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>(); 

Mais franchement la structure o suce, vous devez construire la liste des éléments comme un IEnumerable ou IList ou quelque chose, pas #Parameters * #Rows.

+0

Faites-vous référence au schéma de la base de données? –