如何将给定的lambda查询转换为IQueryable



我准备了这个Linq-to-SQL查询,它需要作为IQueryable执行,但它失败了。

当我通过调用ToList来转换filteredResult时,它工作得很好,但我需要使用filteredResult作为IQueryable,并得到如下所示的选择结果。但我收到一个错误

带有语句体的lambda表达式无法转换为表达式树

浏览了下面的链接,但是,下面的查询如何转换为IQueryable。根据链接,我是否需要编写Func<object,object>或任何转换查询的示例都会非常有用。

"具有语句体的lambda表达式不能转换为表达式树";

var result = filteredResult.Select(g => {
var type1 = g.FirstOrDefault(x => x.CategoryId == (int)CategoryEnum.Typ1);
var type2 = g.FirstOrDefault(x => x.CategoryId == (int)CategoryEnum.Typ2);
return new AutoDetailDto
{
MilestoneId = g.Key.MilestoneId,
MilestoneName = g.Key.MilestoneName,
PGrade = type1?.GDR,
PGradeChange = type1?.HighestGDR
QGrade = type2.GDR,
QGradeChange = type2?.HighestGDR    
};
});

单独的函数没有帮助。无论哪种情况,系统都无法从复杂的C#代码中生成SQL。

试试这个:

// 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    
});

我认为这应该有效。让我知道。

编辑:

奇怪的是,尽管不允许使用null传播运算符,但旧的条件if是,所以请尝试:

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    
});

最新更新