首页 > 解决方案 > Linq 查询返回列表中的项目,其中包含另一个列表

问题描述

我是 Linq 查询的新手,这个问题遇到了我(在另一个开发人员被解雇之后)。我正在使用一个货运 API,该 API 返回申请单中每个产品/项目的“n”个货运价格列表。响应类是:

public class FreightSimulation
{
    public List<Item> Items { get; set; }
}

public class Item
{
    public int Id { get; set; }
    public List<ItemFreight> Freights { get; set; }
}

public class ItemFreight
{
    public Company Company { get; set; }
    public Type Type { get; set; }
    public double Price { get; set; }
    public int Days { get; set; }
    public List<Error> Errors { get; set; }
}

public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Type
{
    public int Id { get; set; }
    public string Description { get; set; }
}

public class Error
{
    public string Message { get; set; }
}

我有 2 个项目的响应模型(但也可以是“n”个项目),其中一个有 5 种运费可能性,没有错误,但另一个有两个错误,这意味着一家公司没有货运服务该项目:

var response = new FreightSimulation
    {
        Items = new List<Item>
        {
            new Item
            {
                Id = 1,
                Freights = new List<ItemFreight>
                {
                    new ItemFreight
                    {
                        Errors = null,
                        Price = 10,
                        Days = 8,
                        Company = new Company
                        {
                            Id = 1
                        },
                        Type = new Type
                        {
                            Id = 3
                        }
                    },
                    new ItemFreight
                    {
                        Errors = null,
                        Price = 20,
                        Days = 3,
                        Company = new Company 
                        {
                            Id = 1
                        },
                        Type = new Type 
                        {
                            Id = 8
                        }
                    },
                    new ItemFreight
                    {
                        Errors = null,
                        Price = 20,
                        Days = 10,
                        Company = new Company
                        {
                            Id = 2
                        },
                        Type = new Type 
                        {
                            Id = 1
                        }
                    },
                    new ItemFreight
                    {
                        Errors = null,
                        Price = 35,
                        Days = 4,
                        Company = new Company
                        {
                            Id = 2
                        },
                        Type = new Type
                        {
                            Id = 2
                        }
                    },
                    new ItemFreight
                    {
                        Errors = null,
                        Price = 15,
                        Days = 6,
                        Company = new Company
                        {
                            Id = 7468
                        },
                        Type = new Type
                        {
                            Id = 1
                        }
                    }
                }
            },
            new Item
            {
                Id = 2,
                Freights = new List<ItemFreight>
                {
                    new ItemFreight
                    {
                        Errors = null, 
                        Price = 10, 
                        Days = 8, 
                        Company = new Company 
                        {
                            Id = 1
                        },
                        Type = new Type 
                        {
                            Id = 3
                        }
                    },
                    new ItemFreight
                    {
                        Errors = null,
                        Price = 20,
                        Days = 3,
                        Company = new Company 
                        {
                            Id = 1
                        },
                        Type = new Type 
                        {
                            Id = 8
                        }
                    },
                    new ItemFreight
                    {
                        Errors = new List<Error>
                        {
                            new Error
                            {
                                Message = "Not found."
                            }
                        }, 
                        Company = new Company 
                        {
                            Id = 2
                        },
                        Type = new Type 
                        {
                            Id = 1
                        }
                    },
                    new ItemFreight
                    {
                        Errors = new List<Erro>
                        {
                            new Error
                            {
                                Message = "Not found."
                            }
                        },
                        Company = new Company 
                        {
                            Id = 2
                        },
                        Type = new Type 
                        {
                            Id = 2
                        }
                    },
                    new ItemFreight
                    {
                        Errors = null,
                        Price = 22,
                        Days = 4,
                        Company = new Company 
                        {
                            Id = 7468
                        },
                        Type = new Type 
                        {
                            Id = 1
                        }
                    }
                }
            }
        }
    };

我首先需要的是一个 Linq 查询,它带来一个列表,其中子列表在所有项目之间是通用的,并且其中没有错误。

在这种情况下,我有类似的东西:

          Company Id     Type Id     Error
Item 1        1             3          N
Item 1        1             8          N
Item 1        2             1          N
Item 1        2             2          N
Item 1       7468           1          N
Item 2        1             3          N
Item 2        1             8          N
Item 2        2             1          Y
Item 2        2             2          Y
Item 2       7468           1          N

所以在这种情况下,我需要一个列表,其中组合只有公司 1 和 7468(可能是“n”家公司)。因此,在第 2 项中,我的公司 2 响应有错误,因此必须将其消除。结果将是:

          Company Id     Type Id     Error
Item 1        1             3          N
Item 1        1             8          N
Item 1       7468           1          N
Item 2        1             3          N
Item 2        1             8          N
Item 2       7468           1          N

任何组合公司/类型都可能发生这种情况,因此如果可能的话,它必须是某种动态查询。

提前致谢。

标签: c#.netapilinqhttp

解决方案


您可以获得对任何运费返回错误的公司:

        var errorCompanyIds = response.Items
            .SelectMany(x => x.Freights)
            .Where(y => y.Errors !=null && y.Errors.Any())
            .Select(y => y.Company.Id)
            .ToList();

然后您可以创建新列表并过滤来自该公司的任何货运

        var newList = new FreightSimulation
        {
            Items = response.Items.Select(x => new Item
            {
                Id = x.Id,
                Freights = x.Freights.Where(y => !errorCompanyIds.Contains(y.Company.Id)).ToList()
            }).ToList()

        };

推荐阅读