C# 集中或整合LINQ select
如何重构此代码以便集中投影C# 集中或整合LINQ select,c#,linq,C#,Linq,如何重构此代码以便集中投影 public IEnumerable<ItemDto> GetItemsByType(int itemId, ItemType itemType) { IEnumerable<ItemDto> items = null; try { var tempItems= _Items.Get(i => i.ItemId == itemId && o.Active ==
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 { ... }
}
public IEnumerable GetItemsByType(int-itemId,ItemType-ItemType)
{
IEnumerable items=null;
尝试
{
var tempItems=\u Items.Get(i=>i.ItemId==ItemId
&&o.有效==真实);
开关(项目类型)
{
案例项目类型。正常:
items=来自tempItems中的item
选择“新建项目”以删除
{
//这里有很多田地
};
打破
箱子项目类型。损坏:
items=来自tempItems中的item
在item.ID上的_ItemDetails.Get()中联接itemDetail等于itemDetail.ItemID
选择“新建项目”以删除
{
//这里有很多田地
};
打破
案例ItemType。已修复:
items=来自tempItems中的item
在item.ID上的_ItemDetails.Get()中联接itemDetail等于itemDetail.ItemID
其中item.Status.ToLower()=“已修复”
选择“新建项目”以删除
{
//这里有很多田地
};
打破
//更多的案例陈述在这里。。。
违约:
打破
}
}
捕获{…}
}
基本上,我有很多案例陈述和每个案例陈述的长投影。我担心一旦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... ));
你能这样处理吗
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();
这种方法会有帮助吗
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 { .... });
}
public IEnumerable GetItemsByType2(int-itemId,ItemType-ItemType)
{
var cases=newdictionary()
{
{ItemType.Normal,xs=>xs},
{ItemType.Damaged,xs=>
从xs中的项
在item.ID上的_ItemDetails.Get()中联接itemDetail等于itemDetail.ItemID
选择项},
{ItemType.Fixed,xs=>
从xs中的项
在item.ID上的_ItemDetails.Get()中联接itemDetail等于itemDetail.ItemID
其中item.Status.ToLower()=“已修复”
选择项},
};
返回案例[itemType](_Items.Get(i=>i.ItemId==ItemId&&o.Active==true))
.Select(x=>newitemdto{..});
}
这里的许多字段是否都是相同的代码?是的,它们是相同的代码那么我的答案可能会有用。这里的问题是一些选择案例与其他集合有连接,我需要这些集合的字段来进行DTO。如果我只选择了“选择项”,则我将无法使用已加入集合中的那些字段。其他答案也很有用,但这最终会引导我找到解决方案。谢谢