首页 > 解决方案 > C# Linq 选择/加入自定义返回类型

问题描述

我有以下 linq 示例:

List<FoodOrderItem> foodOrderItems = foodItemsWithPricesDbResult.ResultValue;

List<FoodOrderItem> orderItemsWithDiscounts= (from orderItem in order.Items
 join foodOrderItem in foodOrderItems
 on orderItem.FoodId equals foodOrderItem.Id
 select mergeOrderAndFoodInformation(foodOrderItem,orderItem)).ToList();

.
.
.
private static FoodOrderItem mergeOrderAndFoodInformation(FoodOrderItem foodOrderItem, OrderItem orderItem)
{
    foodOrderItem.DiscountValue = orderItem.DiscountValue;
    foodOrderItem.DiscountKind = orderItem.DiscountKind;
    foodOrderItem.CurrentOrderedCount = orderItem.Count;
    return foodOrderItem;
}

mergeOrderAndFoodInformation函数更新输入foodOrderItem对象的某些字段并返回更新后的 foodOrderItem。

1-如果我不想使用诸如更新和返回结果之类的函数,如何以内联样式编写该select mergeOrderAndFoodInformation(foodOrderItem,orderItem)部分?我的意思是如果我想在不使用外部函数的情况下编写代码,我该如何更改段?mergeOrderAndFoodInformationselect mergeOrderAndFoodInformation(foodOrderItem,orderItem)

2-如何使用 Lambda 表示法编写此 linq 查询?

PS如果没有正确使用诸如inline和之类的关键字,请接受我的道歉。external如果您纠正我,以防有一些错误,我将不胜感激。

标签: c#linqjoinlambda

解决方案


您正在修改源集合中的对象,这在使用 Linq 时通常不是最佳实践。它将要求您使用 lambda 语法来内联函数,如下所示:

order.Items.Join(foodOrderItems, oi=>oi.FoodId, foi=>foi.Id, (oi, foi) => new {oi, foi})
           .Select(j => {
                          j.foi.DiscountValue = j.oi.DiscountValue;
                          j.foi.DiscountKind = j.oi.DiscountKind;
                          j.foi.CurrentOrderedCount = j.oi.Count;   
                          return j.foi;                         
                        })
            .ToList()

请注意,Join在 lambda 语法中更丑(恕我直言),并且内联函数不会给您带来很多好处。


推荐阅读