簡體   English   中英

LINQ 方法將值作為單個 object 包括嵌套數組返回

[英]LINQ method to return values as a single object including a nested array

目標:返回單個 object 的sum和詳細信息列表。 { Sum: 1, [ { Amount: 2, Hex: '#123456' }, { Amount: 1, Hex: '#123456' } ] }

使用以下內容,我無法實現目標:

    var data = (await _context.Users
        .Where(u => u.Id == userId)
        .SelectMany(ue => ue.Expenses)
        .Where(ue => ue.CreatedOn.Date <= insightsFilter.To.Value.Date 
            && ue.CreatedOn.Date >= insightsFilter.From.Value.Date)
        .Include(ue => ue.UserExpenses)
        .Include(e => e.Category)
        .ToListAsync());
    
    var response = data.Select(e => new GetCategoriesDto {
        Sum = e.UserExpenses.Sum(ue => ue.Amount),
        Data = data.GroupBy(e => e.Category.Name.ToLower())
            .Select(cl => new GetDetailsDto {
                    Hex = "#123456"
            }).ToList()
    });

output 是一個單一的陣列,如下所示:

{ Sum: 3, Data: [  { Sum: 2, Amount: 2, Hex: '#123456' }, { Sum: 1, Amount: 1, Hex: '#123456' } ] }

其中 Sum 是重復的,而不是在 JSON object 之上,其值為 2 + 1 = 3。

有人可以讓我知道我做錯了什么...謝謝!

數據如下:

- Users
 -- UserExpenses (Junction) - Contains Amount value.
  -- Expenses - Contains Category value.


    public class Expense
    {
        [Key]
        public int Id { get; set; }
        public Category Category { get; set; }
        public int UserId { get; set; }
        public User User { get; set; }
        public List<UserExpenseJunction> UserExpenses { get; set; } = new List<UserExpenseJunction>();
    }

    public class  UserExpenseJunction {
        [Key]
        public int Id { get; set; }
        public int UserId { get; set; }
        public User User { get; set; }
        public int ExpenseId { get; set; }
        public Expense Expense { get; set; }
        public decimal Amount { get; set; }
        public string Currency { get; set; }
}


    public class User
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public byte[] PasswordHash { get; set; }
        public byte[] PasswordSalt { get; set; }
        public IList<Expense> Expenses { get; set; }
        public IList<UserExpenseJunction> UserExpenses { get; set; }
        public bool Verified { get; set; }
        public DateTime CreatedOn { get; set; }
        public DateTime UpdatedOn { get; set; }
}

您正在列表中執行Select因此它當然會為列表中的每個項目創建一個GetCategoriesDto

你需要把總和作為一個單獨的項目來做,所以我認為這樣的事情應該可以工作(我沒試過)

 var response = new {
       Sum = data.Select(e => e.UserExpenses.Sum(g => g.Amount)).Sum(),
       data.Select(e => new GetCategoriesDto {
           Data = data.GroupBy(e => e.Category.Name.ToLower())
            .Select(cl => new GetDetailsDto {
                    Amount = cl.Amount.Sum(),
                    Hex = "#123456"
            }).ToArray()
    });

我有點猜測,因為您的問題中缺少一些代碼。

response是一個列表,因為您將它創建為一個列表: var response = data.Select(...).ToList()

創建reponse為:

var response = new GetCategoriesDto 
{
  //Sum = sum of amounts, ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM