我有两个表:优化LINQ,而不是创建新的集合/回路
发票(InvoiceID,InvoiceNumber)
Invoices_Products(InvoiceID,产品ID,IsFinalized)
我展示列表所有发票,并且有按钮可以通过“定稿”或“未定稿”发票进行过滤。最终发票是每产品是IsFinalized==true
。
此刻,我有以下代码正在执行非常慢:
IEnumerable<Invoice> invoices = db.Invoices;
if (isFinalized) // filter by finalized invoices
{
List<Invoice> unfinalizedInvoices = new List<Invoice>();
foreach (var invoice in invoices)
{
int invoicesProductsCountTotal = db.Invoices_Products.Where(l => l.InvoiceID == invoice.InvoiceID).Count();
int invoicesProductsCountFinalized = db.Invoices_Products.Where(l => l.InvoiceID == invoice.InvoiceID && l.IsFinalized == true).Count();
if (invoicesProductsCountTotal != invoicesProductsCountFinalized)
{
unfinalizedInvoices.Add(invoice);
}
}
invoices = invoices.Except(unfinalizedInvoices);
}
else
{
List<Invoice> finalizedInvoices = new List<Invoice>();
foreach (var invoice in invoices)
{
int invoicesProductsCountTotal = db.Invoices_Products.Where(l => l.InvoiceID == invoice.InvoiceID).Count();
int invoicesProductsCountFinalized = db.Invoices_Products.Where(l => l.InvoiceID == invoice.InvoiceID && l.IsFinalized == true).Count();
if (invoicesProductsCountTotal == invoicesProductsCountFinalized && invoicesProductsCountFinalized > 0)
{
finalizedInvoices.Add(invoice);
}
}
invoices = invoices.Except(finalizedInvoices);
}
我知道这是不是最佳的,但我喜欢传播我的LINQ,这样我可以阅读和理解它。
我的问题:有没有什么办法可以使这个查询更快使用.All
或.Any
什么的,或者我需要重新考虑我的数据库设计(可能增加一个额外的列在发票表)
编辑:第三张表是产品(ProductID,ProductNumber),但您知道
谢谢。但是我用'Invoices_Products'作为许多一对多连接表 - 它拥有像“数量”,“SellingPrice”等。(顺便说一句,我没有使用代码第一 - 第一个使用数据库)数列 – user982119 2014-09-23 15:42:12
您仍然可以做到这一点,但不是多对多,而是定义两个一对多的关系。然后你可以用LINQ来遍历它 – Kenneth 2014-09-23 16:01:35