基于数组结果的LINQ SUM数据

时间:2014-05-21 14:48:47

标签: c# linq

我坚持这个问题。我知道它可以很好地完成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之后,它突然变得毫无问题。我不明白为什么会这样,但我下次肯定会更清楚我会使用什么类型。 再次感谢大家!

1 个答案:

答案 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用户在评论中提出了一些更改!