我坚持这个问题。我知道它可以很好地完成LINQ(我不想使用多个foreach循环),但我根本无法让它工作。这是问题所在:
我有两个班级:
班级发票
public class Invoice
{
public int InvoiceID { get; set; }
public string Name { get; set; }
public DateTime DueDate { get; set; }
public Invoice(int ID, string sName, DateTime dt_Date)
{
this.InvoiceID = ID;
this.Name = sName;
this.DueDate = dt_Date;
}
}
和班级活动
public class Activity
{
public int ActivityID { get; set; }
public int InvoiceID { get; set; }
public int Count { get; set; }
public double Price { get; set; }
public Activity(int ID, int InvoiceID, int iCount, double dPrice)
{
this.ActivityID = ID;
this.InvoiceID = InvoiceID;
this.Count = iCount;
this.Price = dPrice;
}
}
逻辑是每个发票包含多个活动。例如。你有一个商店的账单(发票),其中包括面包,黄油,牛奶(活动)等物品。
我想要做的是根据用户选择的日期,我想要返还支付的总金额(基本上我想从特定日期执行所有账单的SUM)。
这就是我所拥有的:
//user selected DateTime - for the sake of test we make it current day
DateTime selectedDate = DateTime.Now;
//Retrieve invocies that match user selected Date
var retrievedInvoices = invList
.Where(n => n.DueDate.ToShortDateString() == selectedDate.ToShortDateString());
这很好,因为我们根据所需的日期检索了所有发票的清单。但现在?我尝试了以下内容:
//now make SUM of activities that match retrievedInvoices -> look at their
//ID's and if match is found, then multiply price x count
double dResult = invActivity
.Where(n => retrievedInvoices.Where(x=>x.InvoiceID == n.InvoiceID))
.Sum(n => n.Price * n.Count);
但它不起作用。我不是那么精通LINQ所以可能有更优雅的方式(可能在一行代码中)但我不知道。
你们能帮我解决这个问题吗?
修改
有趣的事情还要注意可能正在查看此帖子的其他人:我首先尝试使用List来检索与特定时间段匹配的发票列表(DateTime_From和DateTime_To);但它表现得很奇怪,因为有时工作者正确,有时不行(即使代码是正确的)。在我将List <Invoice> retrievedInvoice
更改为var retrievedInvoice
之后,它突然变得毫无问题。我不明白为什么会这样,但我下次肯定会更清楚我会使用什么类型。
再次感谢大家!
答案 0 :(得分:3)
您的代码看起来很好,但尝试这样的更改:
使用.Date比较没有时间的日期(小时,分钟等),并选择InvoiceID
array
var retrievedInvoices = invList.Where(n => n.DueDate.Date == selectedDate.Date)
.Select(x => x.InvoiceID);
使用.Contains()
检查返回bool值的条件。
double dResult = invActivity
.Where(n => retrievedInvoices.Contains(n.InvoiceID))
.Sum(n => n.Price * n.Count);
Tuespetre
用户在评论中提出了一些更改!