2015-01-07 5 views
6

Wie kann ich diesen Code umgestalten, damit ich die Projektion zentralisieren kann?LINQ zentralisieren oder konsolidieren

Grundsätzlich habe ich viele Fall Aussagen und eine lange Projektion auf jeden Fall Aussage. Ich mache mir Sorgen, dass wenn das DTO geändert werden muss, zB ein neues Feld hinzufügen, die Projektion der anderen Fälle möglicherweise nicht konsistent ist (vergessene oder verpasste Aktualisierung). Wie kann ich das zentralisieren?

+0

Sind jedes der '// viele Felder hier 'der gleiche Code? – Enigmativity

+0

Ja, sie sind der gleiche Code –

+0

Dann kann meine Antwort nützlich sein. – Enigmativity

Antwort

2

Könnten Sie es so nähern?

var query = tempItems.AsQueryable(); 

switch(itemType) 
{ 
    case ItemType.Damaged: 
     query.Join(...); 
     break; 

    case ItemType.Fixed: 
     query.Where(...); 
} 

query.Select(e => new ItemDto{//Lots of properties}); 

return query.ToList(); 
+0

Die anderen Antworten waren ebenfalls hilfreich, aber das führte mich letztendlich zu meiner Lösung. Vielen Dank! –

3

Man könnte so etwas tun:

var baseQuery = from item in tempItems select item; 
switch (itemType) 
{ 
    case ItemType.Fixed: 
     baseQuery = from item in baseQuery where item.ID equals itemID select item; 
     break; 
} 

return (from item in baseQuery select new ItemDTO (...projection here...)); 
+0

Die Sache hier ist, einige der ausgewählten Fälle haben Verbindungen zu anderen Sammlung, deren Felder ich für den DTO brauche. Wenn ich nur Artikel auswähle, sind diese Felder aus den verknüpften Sammlungen für mich nicht verfügbar. –

1

Würde diese Art von Ansatz helfen?

public IEnumerable<ItemDto> GetItemsByType2(int itemId, ItemType itemType) 
{ 
    var cases = new Dictionary<ItemType, Func<IEnumerable<ItemDto>, IEnumerable<ItemDto>>>() 
    { 
     { ItemType.Normal, xs => xs }, 
     { ItemType.Damaged, xs => 
      from item in xs 
      join itemDetail in _ItemDetails.Get() on item.ID equals itemDetail.ItemID 
      select item }, 
     { ItemType.Fixed, xs => 
      from item in xs 
      join itemDetail in _ItemDetails.Get() on item.ID equals itemDetail.ItemID 
      where item.Status.ToLower() == "fixed" 
      select item }, 
    }; 

    return cases[itemType](_Items.Get(i => i.ItemId == itemId && o.Active == true)) 
     .Select(x => new ItemDto { .... }); 
} 
Verwandte Themen