使用linq

时间:2018-09-28 08:22:52

标签: c# linq

我有3个级别的列表,一个列表如下

ProductResults
    ErrorNo
    ErrorString
    Products
        ProductNo
        ProductName
        SVNID
        ProductOrders
            OrderNo
            DateOfOrder
            UDEID

我想检查最低列表中UDEID的值。如果值为77,则我要更新上面“产品”列表中的SVNID。我该如何实现?我在下面尝试过

ProductResultsList.Where(x => x.Products.Any(y => y.ProductOrders.Any(z => z.UDEID == 77))).ToList().
    ForEach(u =>
    {
        u.Products.ForEach(v => v.SVNID = 90);
    });

我的数据

 ProductResultsList.ErrorNo = 0
 ProductResultsList.ErrorString = ""
 ProductResultsList.Products[0].ProductNo = "XY6789U"
 ProductResultsList.Products[0].ProductName = "OrangeJuice"
 ProductResultsList.Products[0].SVNID = 100
 ProductResultsList.Products[0].ProductOrders[0].OrderNo = 201
 ProductResultsList.Products[0].ProductOrders[0].DateOfOrder = 28/09
 ProductResultsList.Products[0].ProductOrders[0].UDEID = 77
 ProductResultsList.Products[1].ProductNo = "XY4569U"
 ProductResultsList.Products[1].ProductName = "AppleJuice"
 ProductResultsList.Products[1].SVNID = 100
 ProductResultsList.Products[1].ProductOrders[0].OrderNo = 202
 ProductResultsList.Products[1].ProductOrders[0].DateOfOrder = 28/09
 ProductResultsList.Products[1].ProductOrders[0].UDEID = 88

上述问题是将所有Products.SVNID更新为90。我只想更新Products [0]而不是Products [1]。我确实知道为什么会这样,因为我的ForEach是ProductResults,但是后来我不知道该怎么做。

请帮助

1 个答案:

答案 0 :(得分:4)

您的问题在于第一个外部“ Any”:

ProductResultsList.Where(x => x.Products.Any( 'condition'))

由于满足了“条件”,因为有“任何”产品,其ProductOrder的UEID = 77,所以您将所有ProductResult撤回了ForEach

您应该“插入”更深的循环,例如(未经测试):

ProductResultsList.ForEach(productResult => {
    productResult.Product.Where(product => 
        product.Any('yourCondition')).ToList()
    .ForEach('your action')

侧面说明:为什么不将其提取为常规方法?如您所见,很难从一开始就跟踪正在发生的事情。使用命名方法会更容易。