【发布时间】:2017-06-08 21:55:44
【问题描述】:
我有以下三个模型。我想在我的 MVC 应用程序中使用 LINQ 将它们加入并分组,以获得所需的结果数据。
尝试使用错误的数据
var query = from i in db.Invoices
join id in db.Invoice_Details
on i.INVOICENO equals id.INVOICENO
join m in db.Mixings
on id.INVOICEDETAILID equals m.INVOICEDETAILID into ms
from m in ms.DefaultIfEmpty()
group new { id,m } by new
{
INVOICENO = id.INVOICENO,
DATE = i.DATE
}
into temp
select new Invoice_List
{
ID = temp.Key.INVOICENO,
INVOICENO = temp.Key.INVOICENO,
CARET = temp.Sum(g => g.id.CARET),
DATE = temp.Key.DATE,
ISSUECARET = (decimal?)temp.Select(c => c.m.CARETUSED).DefaultIfEmpty(0).Sum() ?? 0,
AVAILABLECARET = ((decimal?)temp.Select(c => c.id.CARET).DefaultIfEmpty(0).Sum() ?? 0) - ((decimal?)temp.Select(c => c.m.CARETUSED).DefaultIfEmpty(0).Sum() ?? 0)
};
发票表
INVOICENO DATE
---------------------
1 2017-01-23 00:00:00
2 2017-01-23 00:00:00
发票明细表
INVOICEDETAILID INVOICENO CARET
----------------------------------------------
1 1 100.00
2 1 200.00
3 2 300.00
4 2 400.00
混合表
MIXINGNO INVOICEDETAILID CARETUSED
------------------------------------------------
1 1 50.00
1 2 100.00
2 1 25.00
2 2 50.00
现在我想通过将这三个表与 group by 连接来跟踪结果数据。
预期结果
INVOICENO DATE TOTALCARET CARETUSEDCARET AVAILABLECARET
------------------------------------------------------------------------------------------
1 2017-01-23 00:00:00 300.00 225.00 75.00
2 2017-01-23 00:00:00 700.00 0.00 700.00
错误的结果(1 个 INVOICENO 的 TOTALCARET)
INVOICENO DATE TOTALCARET CARETUSEDCARET AVAILABLECARET
------------------------------------------------------------------------------------------
1 2017-01-23 00:00:00 600.00 225.00 375.00
2 2017-01-23 00:00:00 700.00 0.00 700.00
【问题讨论】:
-
您的问题在哪里?什么不起作用?
-
能否显示表格发票明细表的字段
ID -
我在
TOTALCARET列的结果中得到错误的聚合数据 -
您正在加入
Mixings表,这意味着当它包含多行时,一些Invoice_Details将返回多个。你可能总和太多了。你的TOTALCARET值是不是太高了?您可能会失去混合加入并在分组后加入它 -
您应该在分组后加入
db.Mixings。如您所见,混合表包含 2 行,这就是您的结果是两倍的原因。您没有在群组中使用m,因此您可以稍后加入。太糟糕了,我不能自己测试它,因为我需要自己跟踪和错误。所以我不能直接为您提供一个工作示例。 您可以先从 linq 查询中删除混合表。
标签: c# entity-framework linq asp.net-mvc-5