このコードをリファクタリングして投影を集中化するにはどうすればよいですか?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...));
ここにある「//複数のフィールド」は同じコードですか? – Enigmativity
はい、同じコードです –
私の答えは役に立つかもしれません。 – Enigmativity