Entity framework 多个存储库中属性总和的最佳实践
我有多个存储库,其中包含userId、paidDate和amount属性,如Entity framework 多个存储库中属性总和的最佳实践,entity-framework,asp.net-core,repository-pattern,Entity Framework,Asp.net Core,Repository Pattern,我有多个存储库,其中包含userId、paidDate和amount属性,如Bills(userId、paidDate、amount)Shoppings(userId、paidDate、amount)等。我想获得金额的总和,并按userId对其进行分组,得到如下内容{user1:{amount1,amount2,amount3..,user2:{amount4,…} 我创建了一个包含上述所有存储库的expenseDetails模型 public class ExpenseDetails {
Bills(userId、paidDate、amount)
Shoppings(userId、paidDate、amount)
等。我想获得金额的总和,并按userId对其进行分组,得到如下内容{user1:{amount1,amount2,amount3..,user2:{amount4,…}
我创建了一个包含上述所有存储库的expenseDetails模型
public class ExpenseDetails
{
public IEnumerable<ApplicationUser> ApplicationUsers { get; set; }
public IEnumerable<Bill> Bills { get; set; }
public IEnumerable<Shopping> Shoppings { get; set; }
public IEnumerable<Rent> Rents { get; set; }
}
公共类费用明细
{
公共IEnumerable应用程序用户{get;set;}
公共IEnumerable票据{get;set;}
公共IEnumerable商店{get;set;}
公共IEnumerable租金{get;set;}
}
我创建了一个助手方法,通过在expenseDetails中循环每个模型来计算金额总和
public static Dictionary<string, List<double>> UsersExpense(ExpenseDetails expenseDetails)
{
Dictionary<string, List<double>> TotalCosts = new Dictionary<string, List<double>>();
List<double> Total = new List<double>();
double sum = 0;
foreach (var user in expenseDetails.ApplicationUsers)
{
foreach (var item in expenseDetails.Shoppings)
{
if (item.ApplicationUserId == user.Id)
{
if (Convert.ToInt32(item.PaidDate.Split("/")[1]) == DateTime.Now.Month)
{
sum = item.Amount + sum;
}
}
}
Total.Add(sum);
sum = 0;
foreach (var item in expenseDetails.Bills)
{
if (item.ApplicationUserId == user.Id)
{
if (Convert.ToInt32(item.PaidDate.Split("/")[1]) == DateTime.Now.Month)
{
sum = item.Amount + sum;
}
}
}
Total.Add(sum);
sum = 0;
foreach (var item in expenseDetails.Rents)
{
if (item.ApplicationUserId == user.Id)
{
if (Convert.ToInt32(item.PaidDate.Split("/")[1]) == DateTime.Now.Month)
{
sum = item.Amount + sum;
}
}
}
Total.Add(sum);
sum = 0;
TotalCosts.Add(user.Id, Total.ToList());
Total.Clear();
}
return TotalCosts;
}
公共静态字典用户sexpense(ExpenseDetails ExpenseDetails)
{
Dictionary TotalCosts=新字典();
列表总数=新列表();
双和=0;
foreach(expenseDetails.ApplicationUsers中的var用户)
{
foreach(expenseDetails.Shoppings中的var项目)
{
if(item.applicationSerid==user.Id)
{
if(Convert.ToInt32(item.PaidDate.Split(“/”[1])==DateTime.Now.Month)
{
金额=项目。金额+金额;
}
}
}
总计。加上(总和);
总和=0;
foreach(expenseDetails.Bills中的var项目)
{
if(item.applicationSerid==user.Id)
{
if(Convert.ToInt32(item.PaidDate.Split(“/”[1])==DateTime.Now.Month)
{
金额=项目。金额+金额;
}
}
}
总计。加上(总和);
总和=0;
foreach(expenseDetails.Rents中的var项目)
{
if(item.applicationSerid==user.Id)
{
if(Convert.ToInt32(item.PaidDate.Split(“/”[1])==DateTime.Now.Month)
{
金额=项目。金额+金额;
}
}
}
总计。加上(总和);
总和=0;
TotalCosts.Add(user.Id,Total.ToList());
Total.Clear();
}
返回总成本;
}
但这不是一个好的编程方法。我如何通过最佳实践实现这一点?顺便说一句,我正在使用存储库模式。要获得满足您需求的完整演示,请执行以下操作:
var result = expenseDetails.ApplicationUsers.Select(a => new
{
a.Id,
BillAmountCount = expenseDetails.Bills.Where(b => b.ApplicationUserId == a.Id && Convert.ToInt32(b.PaidDate.Split("/")[1]) == DateTime.Now.Month).Sum(b => b.Amount),
ShoppingAmountCount = expenseDetails.Shoppings.Where(b => b.ApplicationUserId == a.Id && Convert.ToInt32(b.PaidDate.Split("/")[1]) == DateTime.Now.Month).Sum(b => b.Amount),
RentCount = expenseDetails.Rents.Where(b => b.ApplicationUserId == a.Id && Convert.ToInt32(b.PaidDate.Split("/")[1]) == DateTime.Now.Month).Sum(b => b.Amount),
}).ToList().ToDictionary(a => a.Id, a => new List<double>{ a.BillAmountCount, a.ShoppingAmountCount, a.RentCount});
var result=expenseDetails.ApplicationUsers.Select(a=>new) { a、 身份证, BillAmountCount=expenseDetails.Bills.Where(b=>b.ApplicationUserId==a.Id&&Convert.ToInt32(b.PaidDate.Split(“/”[1])==DateTime.Now.Month)。总和(b=>b.Amount), ShoppingAmountCount=expenseDetails.Shoppings.Where(b=>b.ApplicationSerId==a.Id&&Convert.ToInt32(b.PaidDate.Split(“/”[1])==DateTime.Now.Month)。总和(b=>b.Amount), RentCount=expenseDetails.Rents.Where(b=>b.ApplicationUserId==a.Id&&Convert.ToInt32(b.PaidDate.Split(“/”[1])==DateTime.Now.Month)。总和(b=>b.Amount), }).ToList().ToDictionary(a=>a.Id,a=>new List{a.BillAmountCount,a.ShoppingAmountCount,a.RentCount});
如果你要查找代码审查,那么你应该考虑CODReVIEW.StAcExcAux.COM,你也可以查看LINQ来获得和而不是循环。这会更容易理解。示例然后您可以在上面添加所有内容rentSum=expense.Rents.Where(g=>g.UserId==UserId).Sum(g=>g.Amount)