2015-01-07 31 views
6

Bu kodu nasıl yansıtabilirim, böylece projeksiyonu merkezileştirebilirim?LINQ'ı merkezileştirme veya konsolide etme

public IEnumerable<ItemDto> GetItemsByType(int itemId, ItemType itemType) 
{ 
    IEnumerable<ItemDto> items = null; 
    try 
    { 
     var tempItems= _Items.Get(i => i.ItemId == itemId 
      && o.Active == true); 
     switch (itemType) 
     { 
      case ItemType.Normal: 
       items = from item in tempItems 
         select new ItemDto 
         { 
          // many fields here 
         }; 
       break; 
      case ItemType.Damaged: 
       items = from item in tempItems 
         join itemDetail in _ItemDetails.Get() on item.ID equals itemDetail.ItemID 
         select new ItemDto 
         { 
          // many fields here 
         }; 
       break; 
      case ItemType.Fixed: 
       items = from item in tempItems 
         join itemDetail in _ItemDetails.Get() on item.ID equals itemDetail.ItemID 
         where item.Status.ToLower() == "fixed" 
         select new ItemDto 
         { 
          // many fields here 
         }; 
       break; 

      // more case statements here... 

      default: 
       break; 
     } 
    } 
    catch { ... } 
} 

Temel olarak, her bir vaka bildirimi için çok fazla vaka bildirimi ve uzun bir projeksiyon var. DTO'nun değişmesi gerektiğinde, yeni bir alan ekledikten sonra, diğer vakaların projeksiyonlarının birbiriyle tutarlı olmayabileceğinden endişeleniyorum (güncellemeyi unuttum veya kaçırdınız). Bunu nasıl merkezleyebilirim?

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

Buradaki birçok // alanın hepsi aynı kod mu? – Enigmativity

+0

Evet, aynı kod –

+0

kodları. Sonra cevabım faydalı olabilir. – Enigmativity

cevap

2

Eğer böyle yaklaşmak Could: Böyle bir şey yapabileceğini

+0

Diğer cevaplar da yardımcı oldu, ancak bu sonuçta bana çözümümün yolunu açtı. Teşekkürler! –

3

?

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

Buradaki bazı seçimler, alanları DTO için ihtiyaç duyduğum diğer koleksiyonlara katılıyor. Yalnızca 'öğe seç' yaparsam, birleştirilmiş koleksiyonlardan gelen alanlar benim için uygun olmaz. –

1

Bu tür bir yaklaşım yardımcı olur mu?

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 { .... }); 
} 
İlgili konular