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。如果我只选择了“选择项”,则我将无法使用已加入集合中的那些字段。其他答案也很有用,但这最终会引导我找到解决方案。谢谢