2015-01-07 10 views
6

このコードをリファクタリングして投影を集中化するにはどうすればよいですか?LINQの集中化または統合

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 { ... } 
} 

基本的に、私は多くのケースステートメントとそれぞれのケースステートメントの長い投影を持っています。私は、DTOを変更する必要があると、新しいフィールドを追加すると、他のケースの投影が互いに矛盾している(更新を忘れていたか忘れていた)かもしれないと心配しています。どうすればこれを集中化できますか?

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

ここにある「//複数のフィールド」は同じコードですか? – Enigmativity

+0

はい、同じコードです –

+0

私の答えは役に立つかもしれません。 – Enigmativity

答えて

2

は、あなたはそれがこのようにアプローチでした:あなたはこのような何かを行うことができ

+0

その他の回答も役に立ちましたが、最終的に私を私の解決に導いてくれました。ありがとう! –

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

ここでは、選択されたケースのいくつかが、DTOに必要なフィールドを持つ他のコレクションへの結合を持っています。 「アイテムを選択する」だけを行うと、結合されたコレクションのフィールドは利用できなくなります。 –

1

このようなアプローチは役に立ちますか?

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 { .... }); 
} 
関連する問題