Очевидно, я не могу заглянуть в вашу базу данных EF, поэтому я создал несколько образцов данных (подразумеваются структуры классов 'item'):
var EF = new efClass {
om0001 = new List<om0001item> {
new om0001item { ID = 0, CUSTOMER = 0, ITEM_CODE = 0, AMOUNT = 10 },
new om0001item { ID = 1, CUSTOMER = 0, ITEM_CODE = 0, AMOUNT = 20 },
new om0001item { ID = 2, CUSTOMER = 1, ITEM_CODE = 1, AMOUNT = 30 },
new om0001item { ID = 3, CUSTOMER = 1, ITEM_CODE = 1, AMOUNT = 40 }
},
ep0001 = new List<ep0001item> {
new ep0001item { om0001_ID = 0, EXPORT_AMOUNT = -20 },
new ep0001item { om0001_ID = 1, EXPORT_AMOUNT = -20 }
}
};
С этими данными я создал запрос, который, честно говоря, кажется Неэлегантно и разочаровало меня, но такова природа левых объединений в LINQ:
var testjoin = from om0001 in EF.om0001
join ep0001 in EF.ep0001 on om0001.ID equals ep0001.om0001_ID into jointable
select new { om0001, ep0001 = jointable.DefaultIfEmpty() } into combined
group combined by new {
combined.om0001.CUSTOMER,
combined.om0001.ITEM_CODE
} into g
select new {
CUSTOMER = g.Key.CUSTOMER,
ITEM_CODE = g.Key.ITEM_CODE,
om0001SUMamount = g.Sum(x => x.om0001.AMOUNT),
ep0001EXPORTsumAmount = g.Sum(x => x?.ep0001.Sum(y => y?.EXPORT_AMOUNT ?? 0))
};
Суть в том, что когда вы группируете по «объединяемому», вы теряете ссылку на ep0001. Итак, выделите и ep0001, и om0001 в новый «комбинированный» объект, а затем сгруппируйте его на основе этого.
Когда я создавал библиотеку javascript ( fluent-data ), которая имела некоторые LINQ-подобные функции, я испытывал большое уважение и сострадание к разработчикам LINQ. Тем не менее, я не знаю, почему они просто не создают оператор левого соединения, чтобы повысить ценность всех разработчиков C#, использующих LINQ.