如何解决LINQ方法可将值返回为包含嵌套数组的单个对象
目标:返回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()
});
输出是单个数组,例如:
{ Sum: 3,Data: [ { Sum: 2,Amount: 2,{ Sum: 1,Amount: 1,Hex: '#123456' } ] }
重复求和而不是将其放在JSON对象的顶部,其值是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,...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。