【问题标题】:How to make nested list from one base list如何从一个基本列表制作嵌套列表
【发布时间】:2020-06-22 20:40:43
【问题描述】:

我想从这个列表中创建嵌套列表

public class Product
{
    string Id;
    string ProductName;
    decimal Price;
    string Supplier;
    int Quantity;
    string VersionId;
    string TypeId;
}

public class ProductTypeDto
{
    public string TypeId { get; set; }
    public string ProductName { get; set; }
    public string Price { get; set; }
    public List<ProductVersionDto> ProductVersions { get; set; }
}

public class ProductVersionDto
{
    public string VersionId { get; set; }
    public string ProductName { get; set; }
    public string Supplier { get; set; }
    public int Quantity { get; set; }
}

我想知道如何使用 linq c# 创建 ProductTypeDto 列表。 我需要获取具有相同 TypeId 的所有产品,并且 ProductVersions 字段应该包含具有相同版本 ID(当然还有相同的 TypeId)的产品。 我不想使用 foreach 循环,也不想循环两次产品来制作这个嵌套列表。我认为使用 Linq 会有更好的方法,如果你能提供帮助会很棒。。
编辑:我在这里添加我到目前为止所做的事情,但这不是我想要修复的方式。

List<ProductTypeDto> products = this._dbContext
            .Products
            .Where(product => product.TypeId == query.TypeId)
            .Select(product => new ProductTypeDto()
            {
                TypeId = product.TypeId,
                ProductName = product.ProductName,
                Price = product.Price,
                ProductVersions = product.Products.Where(p => p.TypeId == product.TypeId)
                                         .Select(p => new ProductVersionDto()
                                         {
                                             VersionId = p.VersionId,
                                             ProductName = p.ProductName,
                                             Supplier = p.Supplier,
                                             Quantity = p.Quantity
                                         }).ToList()
            })
            .ProjectTo<ProductTypeDto>(this._config)
            .ToListAsync(cancellationToken);

这是我想要得到的结果:

   var product1 = new Product() { Id = 1, ProductName = "foo", Price = 20, Supplier = "test1", Quantity = 3, VersionId = "1", TypeId = "1" };
    var product2 = new Product() { Id = 2, ProductName = "foo1", Price = 60, Supplier = "test2", Quantity = 9, VersionId = "1", TypeId = "1" };
    var product3 = new Product() { Id = 3, ProductName = "foo2", Price = 30, Supplier = "test3", Quantity = 5, VersionId = "2", TypeId = "1" };
    var product4 = new Product() { Id = 4, ProductName = "foo3", Price = 10, Supplier = "test4", Quantity = 4, VersionId = "1", TypeId = "2" };
    var product5 = new Product() { Id = 5, ProductName = "foo4", Price = 50, Supplier = "test5", Quantity = 8, VersionId = "1", TypeId = "3" };

    List<ProductVersionDto> p1 = {
        new ProductVersionDto { ProductName = "foo", Quantity= 3, Supplier ="test1"}
        new ProductVersionDto { ProductName = "foo1", Quantity= 9, Supplier ="test2"}
    };
    List<ProductVersionDto> p2 = {
        new ProductVersionDto { ProductName = "foo3", Quantity= 4, Supplier ="test4"}
    };
    List<ProductVersionDto> p3 = {
        new ProductVersionDto { ProductName = "foo4", Quantity= 8, Supplier ="test5"}
    };

    List<ProductTypeDto> products = {
        new ProductTypeDto{ ProductName = "foo", Price =20, ProductVersions = p1}
        new ProductTypeDto{ ProductName = "foo1", Price =60, ProductVersions = p1}
        new ProductTypeDto{ ProductName = "foo3", Price =10, ProductVersions = p2}
        new ProductTypeDto{ ProductName = "foo4", Price =50, ProductVersions = p3}
    }

【问题讨论】:

  • 我想成为美国总统,但没有任何努力
  • 你能分享期望结果的数据样本吗?
  • @Mana 但你也必须展示你的努力,所以这不是一个喂饭的网站。请以积极的态度接受我的评论
  • @Mana - Viveknuna 有道理。当您提出更好的问题时,您往往会得到更好的答案。提出问题的努力程度也激发了更多人的回答。
  • @Mana 为什么foo2 不存在于预期的结果中?

标签: c# linq cqrs


【解决方案1】:

试试这个:

var dtos =
(
    from p in products
    group new ProductVersionDto()
    {
        VersionId = p.VersionId,
        ProductName = p.ProductName,
        Supplier = p.Supplier,
        Quantity = p.Quantity
    } by new { p.TypeId, p.ProductName, p.Price } into g
    select new ProductTypeDto()
    {
        TypeId = g.Key.TypeId,
        ProductName = g.Key.TypeId,
        Price = g.Key.Price,
        ProductVersions = g.ToList(),
    }
).ToList();

看来您的意思是 Pricedecimal 中的 ProductTypeDto,顺便说一句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多