Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#_Linq - Fatal编程技术网

C# 基于阵列结果的LINQ求和数据

C# 基于阵列结果的LINQ求和数据,c#,linq,C#,Linq,我被这个问题困住了。我知道使用LINQ可以很好地完成,我不想使用多个foreach循环,但我无法让它工作。问题是: 我有两门课: 类别发票 课堂活动 逻辑是每个发票包含多个活动。例如,您有一张来自商店发票的账单,其中包括面包、黄油、牛奶等物品 我想做的是,根据用户选择的日期,我想返回支付的总金额,基本上我想执行特定日期期间所有账单的总和 以下是我所拥有的: //user selected DateTime - for the sake of test we make it current day

我被这个问题困住了。我知道使用LINQ可以很好地完成,我不想使用多个foreach循环,但我无法让它工作。问题是:

我有两门课:

类别发票

课堂活动

逻辑是每个发票包含多个活动。例如,您有一张来自商店发票的账单,其中包括面包、黄油、牛奶等物品

我想做的是,根据用户选择的日期,我想返回支付的总金额,基本上我想执行特定日期期间所有账单的总和

以下是我所拥有的:

//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 retrievedInvoice更改为var retrievedInvoice后,它突然正常工作了。我不明白为什么会这样,但下次我肯定会更清楚我用的是什么类型。
再次感谢各位

您的代码看起来不错,但请尝试以下更改:

使用.Date只比较日期,而不比较时间、小时、分钟等。。并将eh InvoiceID proeprty选择到数组中

使用.Contains检查返回布尔值的条件

double dResult = invActivity
    .Where(n => retrievedInvoices.Contains(n.InvoiceID))
    .Sum(n => n.Price * n.Count);

Tuespetre用户在下面的评论中建议了一些更改

提示:it's not working(它不起作用)这个短语不会在这里出现。请描述它如何不符合您的期望。我已经编辑了您的标题。请看,如果一致意见为“否”,则不应该。invList对象是什么?为什么不选择所有与条件匹配的发票ID,并使用包含而不是任何?通过调用ToArray,将执行查询。如果你离开ToArray,LINQ应该足够聪明,可以放入一个子查询。。。InvoiceId在哪里从发票中选择InvoiceId在哪里…很好,我知道它与NHibernate一起工作,它与实体框架一起工作吗?是的。例如,请参见此处接受的答案:它们以内联方式声明子查询,而不是像您一样声明前一个变量。我更喜欢前一个变量而不是内联变量,更易于阅读,并且当您考虑如何解析它时,EF将看到包含,然后确定它是否可查询。如果它是IQueryable,它可以构建SQL子查询,但如果不是,那么它必须为数组或列表中的每个项自动填充一大堆参数。
//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);
var retrievedInvoices = invList.Where(n => n.DueDate.Date == selectedDate.Date)
                               .Select(x => x.InvoiceID);
double dResult = invActivity
    .Where(n => retrievedInvoices.Contains(n.InvoiceID))
    .Sum(n => n.Price * n.Count);