所以我有一个SQL查询跟随
SELECT P.Date, P.CategoryName, P.ProductName, SUM(Quantity) Quantity, SUM(Sales) TotalSales, IsLevelThree FROM Products P LEFT JOIN LevelThreeTracking LTT ON P.Date = LTT.Date AND P.CategoryName = P.CategoryName AND P.SecurityID = LTT.SecurityID WHERE P.Date = '12-31-2007' AND P.CategoryName= 'CategoryName' GROUP BY P.Date, P.CategoryName, P.ProductName, LTT.IsLevelThree HAVING SUM(Quantity) <> 0 ORDER BY P.ProductName
我正在尝试将其转换为C#LINQ语法,并使用2个表进行DataContext设置.我已经尝试了几次(下面的最新版本)但是生成的sql看起来非常复杂并且超时.dtpBeginning是一个DateTimePicker.
var results = from p in dbFAS.Products group p by new {p.Date, p.CategoryName, p.ProductName} into gp join ltt in dbFAS.LevelThreeTracking on new {gp.Key.Date, gp.Key.CategoryName, gp.Key.ProductName} equals new {ltt.Date, ltt.CategoryName, ltt.ProductName} into everything from e in everything.DefaultIfEmpty() where gp.Key.Date == dtpBeginning.Value.Date && gp.Key.CategoryName == "CategoryName" && gp.Sum(p=>p.Quantity) != 0 select new { gp.Key.Date, gp.Key.CategoryName, gp.Key.ProductName, Quantity = gp.Sum(hp=>hp.Quantity), TotalSales = gp.Sum(hp=>hp.Sales), e.Level3 };
我有什么简单的东西吗?关于如何重构LINQ语句以获得更好的东西的任何想法?
是否真的需要转换为LINQ?我建议你把这个查询放在一个存储过程中,因为等效的LINQ查询是难以理解和不可维护的.
试试这个查询,让我知道它是否有效.我将连接更改为where子句,这应该消除LINQ在转换为SQL时生成的所有复杂子查询.
我不确定我是否有LEFT OUTER JOIN部分.我只是包含一个OR条件来测试一方是否存在.
from p in dbFAS.Products from ltt in dbFAS.LevelThreeTracking where p.CategoryName == "CategoryName" && (p.Date == ltt.Date || p.Date) && (p.CategoryName == ltt.CategoryName || p.CategoryName) && (p.ProductName == ltt.ProductName || p.ProductName) && p.Quantity > 0 group p by new {p.Date, p.CategoryName, p.ProductName, p.Quantity, p.Sales, ltt.Level3} into gp select new { gp.Key.Date, gp.Key.CategoryName, gp.Key.ProductName, Quantity = gp.Sum(hp=>hp.Quantity), TotalSales = gp.Sum(hp=>hp.Sales), ltt.Level3 };
编辑: 我想了一些,这可能会更清楚,甚至可以编译!(最后一个不会因为||子句)
from gp in (from p in dbFAS.Products join ltt in dbFAS.LevelThreeTracking on new {p.Date, p.CategoryName, p.ProductName} equals new {ltt.Date, ltt.CategoryName, ltt.ProductName} into temp where p.CategoryName == "CategoryName" && p.Quantity > 0 from t in temp.DefaultIfEmpty() select new { p.Date, p.CategoryName, p.ProductName, p.Quantity, p.Sales, t.Level3 }) group gp by new {gp.Date, gp.CategoryName, gp.ProductName, gp.Level3} select new { gp.Key.Date, gp.Key.CategoryName, gp.Key.ProductName, Quantity = gp.Sum(hp=>hp.Quantity), TotalSales = gp.Sum(hp=>hp.Sales), gp.Level3 }