Попробуйте этот запрос и дайте мне знать, если он работает. Я изменил объединение на условие where, это должно устранить все сложные подзапросы, которые LINQ генерирует при переводе на SQL.
Я не уверен, правильно ли я понял часть LEFT OUTER JOIN. Я просто включил условие ИЛИ, которое проверяет, существует ли одна сторона.
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
};
EDIT:
Я подумал об этом еще немного, и это может быть немного яснее, и это может даже скомпилироваться! (Последнее не из-за предложений ||)
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
}