Отдельная функция не поможет. В любом случае система не может понять, как сгенерировать SQL из сложного C# кода.
Попробуйте:
// This is converted to SQl because the lambda, though compe, is a single statement
var dataResult = filteredResult.Select(g => new {
type1 = g.FirstOrDefault(x => x.CategoryId == (int)CategoryEnum.Typ1),
type2 = g.FirstOrDefault(x => x.CategoryId == (int)CategoryEnum.Typ2),
MilestoneId = g.Key.MilestoneId,
MilestoneName = g.Key.MilestoneName
}).ToArray(); // ToArray() forces execution of the query
// This select is done entirely in memory
var result = dataResult.Select (e =>
new AutoDetailDto
{
MilestoneId = e.MilestoneId,
MilestoneName = e.MilestoneName,
PGrade = e.type1?.GDR,
PGradeChange = e.type1?.HighestGDR
QGrade = e.type2.GDR,
QGradeChange = e.type2?.HighestGDR
});
Я думаю, это должно работать. Дайте мне знать.
РЕДАКТИРОВАТЬ:
Странно то, что, хотя нулевой распространяющий оператор не допускается, старый условный, если есть, так что попробуйте:
var dataResult = filteredResult.Select(g => new {
type1 = g.FirstOrDefault(x => x.CategoryId == (int)CategoryEnum.Typ1),
type2 = g.FirstOrDefault(x => x.CategoryId == (int)CategoryEnum.Typ2),
MilestoneId = g.Key.MilestoneId,
MilestoneName = g.Key.MilestoneName
}); // No forcing of execution here
var result = dataResult.Select (e =>
new AutoDetailDto
{
MilestoneId = e.MilestoneId,
MilestoneName = e.MilestoneName,
PGrade = e.type1 == null ? null : e.type1.GDR,
PGradeChange = e.type1 == null ? null :e.type1.HighestGDR
QGrade = e.type2 == null ? null : e.type2.GDR,
QGradeChange = e.type2 == null ? null : e.type2.HighestGDR
});