C# Linq查询以在一段时间内对某人的付款收据进行分组
我需要帮助来构造linq查询以显示按人员和TransacticID分组的付款。MemberId和年份将通过查询字符串传递给控制器 我有这些模型C# Linq查询以在一段时间内对某人的付款收据进行分组,c#,mysql,asp.net-mvc,linq,C#,Mysql,Asp.net Mvc,Linq,我需要帮助来构造linq查询以显示按人员和TransacticID分组的付款。MemberId和年份将通过查询字符串传递给控制器 我有这些模型 Member(MemberId,MemberName) Payment(PayId, MemberId[foreignkey],TransactId, PayDate, Amount,CategoryId[foreignkey]) Category(CategoryId, CategoryName) 查看下面的输出:John可能进行了两次或更多不同的付
Member(MemberId,MemberName)
Payment(PayId, MemberId[foreignkey],TransactId, PayDate, Amount,CategoryId[foreignkey])
Category(CategoryId, CategoryName)
查看下面的输出:John可能进行了两次或更多不同的付款(无限制,但报告提取时间为12个月),每次付款都有一个具有不同付款类别的唯一TransacticID
因此,在如下所示的数据库支付中:对于2016年12月30日,Cat1、Cat2、Cat3将是单独的行,但具有相同的日期、trasactId和memberId
Name: John Brown TrasactId: 3089ced9-b95e-4625 PayDate: 30/12/2016
Category Amount
Cat1 12.30
Cat2 10.30
Cat3 20.40
Total 43.00
Name: John Brown TrasactId: 1088dfe8-b84e-3625 PayDate: 10/11/2016
Category Amount
Cat1 22.30
Cat2 20.30
Cat3 20.40
Total 63.00
我的尝试显示所有15+付款类别,0金额显示未付款的类别。
乙二醇
我需要什么:我只想显示向其付款的类别
public class MemberPaymentVM // for the table rows
{
public MemberPaymentVM(int categoryCount)
{
Amounts = new List<decimal>(new decimal[categoryCount]);
}
public string Name { get; set; }
public List<decimal> Amounts { get; set; }
public decimal Total { get; set; }
public string TransactId { get; set; }
public DateTime PayDate { get; set; }
}
public class MonthPaymentsVM
{
[DisplayFormat(DataFormatString = "{0:MMMM yyyy}"]
public DateTime Date { get; set; }
public IEnumerable<string> Categories { get; set; }
public List<MemberPaymentVM> Payments { get; set; }
}
public ActionResult YearReceipt(int year, int MemberId)
{
DateTime startdate = DateTime.Now;
DateTime enddate = DateTime.Now;
DateTime date = DateTime.Now;
if (year > 0 && MemberId>0)
{
startdate = (new DateTime(year - 1, 4, 1));
enddate = (new DateTime(year, 3, 31));
// date = (new DateTime(year, month, 1));
}
var filtered = db.Payments.ToList().Where(x => x.PayDate >= startdate && x.PayDate <= enddate && x.POK && x.MemberId==MemberId);
var grouped = filtered.GroupBy(x => new { member = x.MemberId, category= x.Category.ID, txn = x.TransactId, pd = x.PayDate }).Select(x => new
{
Member = x.First().Member,
Category = x.First().Category,
Txn = x.First().TransactId,
Pd = x.First().PayDate,
Amount = x.Sum(y => y.Amount)
});
var data = grouped.GroupBy(x => x.Transact);
var categories = db.Categories;
var categoryCount = categories.Count();
var categoryIDs = categories.Select(x => x.CategoryId).ToList();
var model = new MonthPaymentsVM()
{
Date = date,
Categories = categories.Select(x => x.CategoryName),
Payments = new List<MemberPaymentVM>()
};
foreach (var group in data)
{
MemberPaymentVM payment = new MemberPaymentVM(categoryCount);
var member = group.First().Member;
var txind = group.First().Txn;
var pd = group.First().Pd;
payment.Name = member.Name;
payment.TransactId = txind;
payment.PayDate = pd;
foreach (var item in group)
{
int index = categoryIDs.IndexOf(item.Category.CategoryId);
payment.Amounts[index] = item.Amount;
payment.Total += item.Amount;
}
model.Payments.Add(payment);
}
return View(model);
}
表行的公共类MemberPaymentVM//
{
公共成员PaymentVM(内部类别计数)
{
金额=新列表(新小数[类别计数]);
}
公共字符串名称{get;set;}
公共列表金额{get;set;}
公共十进制总数{get;set;}
公共字符串transactiid{get;set;}
公共日期时间付款日期{get;set;}
}
公共类月付款SVM
{
[DisplayFormat(DataFormatString=“{0:MMMM-yyyy}]”
公共日期时间日期{get;set;}
公共IEnumerable类别{get;set;}
公共列表付款{get;set;}
}
公共行动结果年度收据(国际年度,国际成员ID)
{
DateTime startdate=DateTime.Now;
DateTime enddate=DateTime.Now;
DateTime date=DateTime.Now;
如果(年份>0&&MemberId>0)
{
startdate=(新日期时间(年份-1,4,1));
enddate=(新的日期时间(年,3,31));
//日期=(新日期时间(年、月、1));
}
var filtered=db.Payments.ToList()。其中(x=>x.PayDate>=startdate&&x.PayDate new{member=x.MemberId,category=x.category.ID,txn=x.transact-ID,pd=x.PayDate})。选择(x=>new
{
成员=x.First().Member,
类别=x.First().Category,
Txn=x.First().transactiid,
Pd=x.First().付款日期,
金额=x.Sum(y=>y.Amount)
});
var data=grouped.GroupBy(x=>x.Transact);
var类别=数据库类别;
var categoryCount=categories.Count();
var CategoryId=categories.Select(x=>x.CategoryId.ToList();
var模型=新的MonthPaymentsVM()
{
日期=日期,
类别=类别。选择(x=>x.CategoryName),
付款=新列表()
};
foreach(数据中的var组)
{
MemberPaymentVM付款=新MemberPaymentVM(类别计数);
var member=group.First().member;
var txind=group.First().Txn;
var pd=group.First().pd;
payment.Name=member.Name;
payment.transact-id=txind;
payment.PayDate=pd;
foreach(组中的var项目)
{
int index=CategoryId.IndexOf(item.Category.CategoryId);
付款.金额[索引]=项目.金额;
付款总额+=项目金额;
}
模型。付款。添加(付款);
}
返回视图(模型);
}
看法
@model Paymaster.ViewModel.MonthPaymentsVM
@foreach(模型付款中的var项目)
{
名称:@item.Name
付款日期:@item.PDate.ToString(“dd/MM/yyyy”)
Transact-ID:@item.TxnId
捐赠类别金额
@foreach(Model.Categories中的var类别)
{
@类别
}
@foreach(项目金额中的var金额)
{
@数量
}
总计:@item.Total.ToString(“c”)
}
根据您要显示的视图,您的模型不正确,需要修改
public class MemberPaymentVM
{
public string MemberName{ get; set; }
public string TransactId { get; set; }
[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime PayDate { get; set; }
public IEnumerable<CategoryAmountsVM> Payments { get; set; }
[DisplayFormat(DataFormatString = "{0:C}")]
public decimal TotalAmount { get; set; }
}
public class CategoryAmountsVM
{
public string Category { get; set; }
[DisplayFormat(DataFormatString = "{0:C}")]
public decimal Amount { get; set; }
}
那么在你看来,
@foreach(var item in Model)
{
<div>
<span>@item.MemberName</span>
<span>@item.TransactId</span>
<span>@Html.DisplayFor(m => item.PayDate)</span>
</div>
foreach(var payment in item.Payments)
{
<div>
<span>@payment.Category</span>
<span>@Html.DisplayFor(m => payment.Amount)</span>
</div>
}
<div>
<span>Total</span>
<span>@Html.DisplayFor(m => item.TotalAmount)</span>
<div>
}
@foreach(模型中的变量项)
{
@item.MemberName
@item.Transact-ID
@DisplayFor(m=>item.PayDate)
foreach(项目付款中的var付款)
{
@付款类别
@Html.DisplayFor(m=>payment.Amount)
}
全部的
@DisplayFor(m=>item.TotalAmount)
}
请显示代码,而不是“链接”到它(此处没有链接),有链接供参考是可以的(这是一个加号)但是如果你把相关的代码放在这里,对这个问题的观众还是有帮助的。大部分链接的代码与LINQYou无关。你说你已经修改了解决方案,但没有向我们展示你目前拥有的。你也没有向我们展示你目前正在生产什么与你想要生产什么。这实际上只是一个要求s dump。你可以试着阅读这两篇文章:这篇文章效果很好。我只是想知道添加一个摘要页面会有多大的影响:包括该期间的名称和总付款额抱歉,不清楚你的要求。你现在想创建一个不同的视图吗?也许不同的视图会更好地分离关注点。但我在想有一个封面页来总结全年的总付款。姓名和,以及计算的总付款的33%。这必须通过单独的查询来完成-它涉及不同的挖槽和不同的模型(并且您可以将一个具有两个属性的模型传递给视图,每个查询一个属性)。如果没有更多的细节,也不知道您希望视图的外观如何,则很难提供帮助,因此建议您在遇到问题时提出新问题。
public class MemberPaymentVM
{
public string MemberName{ get; set; }
public string TransactId { get; set; }
[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime PayDate { get; set; }
public IEnumerable<CategoryAmountsVM> Payments { get; set; }
[DisplayFormat(DataFormatString = "{0:C}")]
public decimal TotalAmount { get; set; }
}
public class CategoryAmountsVM
{
public string Category { get; set; }
[DisplayFormat(DataFormatString = "{0:C}")]
public decimal Amount { get; set; }
}
// Use .ToList() at the end so you do not load all records into memory
var filtered = db.Payments.Where(x => x.PayDate >= startdate && x.PayDate <= enddate && x.POK && x.MemberId==MemberId).ToList();
var model = filtered.GroupBy(x => new { member = x.MemberId, txn = x.TransactId, pd = x.PayDate })
.Select(x => new MemberPaymentVM()
{
MemberName = x.First().Member.MemberName,
TransactId = x.Key.txn,
PayDate = x.Key.pd,
TotalAmount = x.Sum(y => y.Amount),
Payments = x.Select(y => new CategoryAmountsVM()
{
CategoryId = y.Category.CategoryName,
Amount = y.Amount
})
});
return View(model);
@foreach(var item in Model)
{
<div>
<span>@item.MemberName</span>
<span>@item.TransactId</span>
<span>@Html.DisplayFor(m => item.PayDate)</span>
</div>
foreach(var payment in item.Payments)
{
<div>
<span>@payment.Category</span>
<span>@Html.DisplayFor(m => payment.Amount)</span>
</div>
}
<div>
<span>Total</span>
<span>@Html.DisplayFor(m => item.TotalAmount)</span>
<div>
}