Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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
C# Linq查询以在一段时间内对某人的付款收据进行分组_C#_Mysql_Asp.net Mvc_Linq - Fatal编程技术网

C# Linq查询以在一段时间内对某人的付款收据进行分组

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可能进行了两次或更多不同的付

我需要帮助来构造linq查询以显示按人员和TransacticID分组的付款。MemberId和年份将通过查询字符串传递给控制器

我有这些模型

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>
}