Как подход к поиску ответа ...
Для диагностики, как предлагает @Jon Skeet, вам нужно упростить ее и посмотреть, что вы получаете в рамках lstSale, чтобы сравнить LINQ с SQL с EntityFramework.
Так что кое-что в следующих строках может помочь (не обязательно синтаксически корректно, потому что у меня нет всех ваших исходных объектов для проверки, однако я просто смотрю на запрос и упрощаю его там, где он может появиться)
var _sale = from emp in setupEmployees
join sales in vwSaleTargets on emp.EmployeeID equals sales.EmployeeID
join price in vwPeriodPricings
on new { sales.SKUID, sales.PeriodID }
equals new { SKUID = (int?)price.SKUID, PeriodID = (int?)price.PeriodID }
join sk in setupSKUs on sales.SKUID equals sk.SKUID
where emp.EmployeeID == 123 && sales.StartDate.Year == 2012 && sales.StartDate.Month == 2
select new
{
EmployeeName = emp.EmployeeName,
StartDate = sales.StartDate,
SalesQuantity = sales.SalesQuantity,
ExFactoryPrice = price.ExFactoryPrice,
SKUID = sk.SKUID,
SKUName = sk.SKUName
};
var lstSale = _sale.ToList(); //to avoid n+1 queries in case of grouping
// Run through lstSale here
foreach(var item in lstSale)
{
Console.WriteLine(item);
}
var sale2 = from x in lstSale
group x by new { x.SKUID, x.EmployeeName } into grouping
select new
{
EmployeeName = grouping.Key.EmployeeName,
SKUID = grouping.Key.SKUID,
SKUName = grouping.SKUName,
MonthSale =(double?)grouping
.Where(x => x.StartDate.Month == 2 &&
x.StartDate.Year == 2012)
.Select(t=>t.SalesQuantity)
.Sum(t=>t.Value)?? 0,
MonthSaleValue = (double?)grouping
.Where(x => x.StartDate.Month == 2 &&
x.StartDate.Year == 2012)
.Sum(x => x.SalesQuantity * x.ExFactoryPrice)
?? 0,
};
Console.WriteLine(sale2.OrderBy(x => x.SKUName).ToList());
Изменения (которые не могут быть действительными):
1. Убран брендинг, так как он не используется во втором запросе (вы можете использовать его как объединение в первом, но не добавлять в новый тип, если это является частью ограничения)
2. Упрощено то, что включено в анонимный тип, сгенерированный первым запросом - если вы потребляете только часть emp / sales / price, тогда это может прояснить, что происходит
3. В первой части добавлено ограничение для SalesMonth (то, что вы делаете во второй части), поскольку это может снизить ваши данные, повысить производительность и позволить вам сосредоточиться на том, что происходит на самом деле (я оставил второе ограничение SalesMonth на месте)
4. Я предполагаю, что SKUID является релевантной частью sk для группировки, и не весь объект требуется