Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 多个存储库中属性总和的最佳实践_Entity Framework_Asp.net Core_Repository Pattern - Fatal编程技术网

Entity framework 多个存储库中属性总和的最佳实践

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 {

我有多个存储库,其中包含userId、paidDate和amount属性,如
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)
然后您可以在上面添加所有内容