![](/img/trans.png)
[英]How can I return a single value integer from Linq from an array of objects that have other nested values
[英]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.