【问题标题】:To add a property value to an existing list of a class将属性值添加到类的现有列表
【发布时间】:2020-05-07 13:23:53
【问题描述】:

有两个表:

public class Fruits
{
    public Guid FruitId { get; set; }
    public string FruitName { get; set; }
    public string FruitType { get; set; }
    public string FruitColor {get; set; }
}

public class FruitSales
{
    public Guid FruitSaleId { get; set; }
    //Foreign key
    public Guid FruitId { get; set; }
    public int Amount {get; set; }
}

所以我有一个类似于下面的模型:

public class FruitsModel
{
    public Guid FruitSaleId { get; set; }
    public Guid FruitId { get; set; }
    public int FruitCount { get; set; }
    public string FruitName { get; set; }
    public string FruitType { get; set; }

}

下面的代码:

var fruitSale = context.FruitSales
                .Include(i => i.Fruits);

//Here I get the FruitSaleId, FruitId and FruitCount 
var fruitCount = fruitSale.GroupBy(g => g.FruitId).Select(s => new FruitsModel
            {
                FruitSaleId = fruitSale.First().FruitSaleId ,
                FruitId = s.Key,
                FruitCount = s.Count().ToString()
            });

现在为了获取 FruitName 和 FruitType 因为它们属于 Fruit 表,而我无法在前面的代码行中获取它们,所以我这样做了:

var tempFruit = fruitCount .ToList();

foreach (var temp in tempFruit )
{
    var res = fruitSale.Where(w => w.FruitSaleId == temp.FruitSaleId ).Select(s => new{FruitName = s.Fruit.FruitName ,FruitType = s.Fruit.FruitType }).FirstOrDefault();
    var fruitDetails = fruitCount .Where(w => w.FruitId == temp.FruitId ).FirstOrDefault();
    fruitDetails.FruitName= res.FruitName;
    fruitDetails.FruitType= res.FruitType;
}

只有fruit count的最后一个元素填充了FruitName和FruitType,其余的都为null。我应该改变什么?

【问题讨论】:

标签: c# linq asp.net-core


【解决方案1】:

您将连接这两个表,然后使用聚合在一个查询中获取所有内容,如下所示:

var fruitCount = fruitSale
    .Join(fruits, s => s.FruitId, f => f.FruitId, (s, f) => new {Sale = s, Fruit = f})
    .GroupBy(g => g.Sale.FruitId)
    .Select(s => 
        new FruitsModel
        {
            FruitSaleId = s.First().Sale.FruitSaleId,
            FruitId = s.Key,
            FruitCount = s.Sum(x => x.Sale.Amount),
            FruitName = s.First().Fruit.FruitName,
            FruitType = s.First().Fruit.FruitType,
            // FruitColor = s.First().Fruit.FruitColor
        });

对于一个完整的工作示例,抱歉我没有你的数据库,所以我用一些对象数据伪造了它

void Main()
{
    // Some selected fruits to sell
    var fruits = new List<Fruit> {
            new Fruit {
                FruitId = Guid.NewGuid(),
                FruitName = "Banana",
                FruitType = "Tropical",
                FruitColor = "Yellow"               
            },
            new Fruit {
                FruitId = Guid.NewGuid(),
                FruitName = "Pineapple",
                FruitType = "Tropical",
                FruitColor = "Yellow"
            },
            new Fruit {
                FruitId = Guid.NewGuid(),
                FruitName = "Nectarine",
                FruitType = "Stone",
                FruitColor = "Red Yellow"
            },
            new Fruit {
                FruitId = Guid.NewGuid(),
                FruitName = "Apricot",
                FruitType = "Stone",
                FruitColor = "Yellow"
            },
            new Fruit {
                FruitId = Guid.NewGuid(),
                FruitName = "Peach",
                FruitType = "Stone",
                FruitColor = "Pinkish Yellow"
            },
            new Fruit {
                FruitId = Guid.NewGuid(),
                FruitName = "Plum",
                FruitType = "Stone",
                FruitColor = "Brownish Gray Purle"
            },
            new Fruit {
                FruitId = Guid.NewGuid(),
                FruitName = "Orange",
                FruitType = "Citrus",
                FruitColor = "Orange"
            },
            new Fruit {
                FruitId = Guid.NewGuid(),
                FruitName = "Lemon",
                FruitType = "Citrus",
                FruitColor = "Yellow"
            }
        };

    // Generate some random fruit sales for each fruit
    var random = new Random();
    var fruitSale = new List<FruitSale>();
    fruits.ForEach(f => fruitSale.Add(
        new FruitSale {
            FruitId = f.FruitId,
            FruitSaleId = Guid.NewGuid(),
            Amount = random.Next(1, 100)
        }));


    // Answer
    var fruitCount = fruitSale
        .Join(fruits, s => s.FruitId, f => f.FruitId, (s, f) => new {Sale = s, Fruit = f})
        .GroupBy(g => g.Sale.FruitId)
        .Select(s => 
            new FruitsModel
            {
                FruitSaleId = s.First().Sale.FruitSaleId,
                FruitId = s.Key,
                FruitCount = s.Sum(x => x.Sale.Amount),
                FruitName = s.First().Fruit.FruitName,
                FruitType = s.First().Fruit.FruitType,
                FruitColor = s.First().Fruit.FruitColor
            })
        .ToList();


    fruitCount.ForEach(c => Console.WriteLine($"{c.FruitSaleId}, {c.FruitId}, {c.FruitCount}, {c.FruitName}, {c.FruitType}, {c.FruitColor}"));
}

public class FruitSale
{
    public Guid FruitSaleId { get; set; }
    public Guid FruitId { get; set; }
    public int Amount { get; set; }
}

public class Fruit
{
    public Guid FruitId { get; set; }
    public string FruitName { get; set; }
    public string FruitType { get; set; }
    public string FruitColor { get; set; }
}
public class FruitsModel
{
    public Guid FruitSaleId { get; set; }
    public Guid FruitId { get; set; }
    public int FruitCount { get; set; }
    public string FruitName { get; set; }
    public string FruitType { get; set; }
    public string FruitColor { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多