如何解决EF Core将生成的和手写的投影表达式区别对待
我正面临一个非常奇怪的案子,我已经将头撞在墙上好几个小时了,我无法理解。
问题:将表达式访问者在运行时生成的表达式传递给Select
方法会导致EF Core抛出异常,同时传递 EXACT SAME 表达式,但这直接写在代码中的时间会很完美。
看看下面的代码,这是不言自明的:
Expression<Func<Book,BookDto>> originalExpr = b => b.ToBookDto();
Expression<Func<Book,BookDto>> generatedExpr = new ExpandableVisitor().Visit(originalExpr) as Expression<Func<Book,BookDto>>;
Expression<Func<Book,BookDto>> sameAsGeneratedExpr = b => new BookDto()
{
Id = b.Id,Name = b.Name,Author = new AuthorDto()
{
Id = b.Author.Id,Name = b.Author.Name,Books = b.Author.Books.Select(b => new BookDto()
{
Id = b.Id,Author = new AuthorDto()
{
Id = b.Author.Id,Books = b.Author.Books.Select(b => b.ToBookDto()).ToList()
}
}).ToList()
}
};
// The following boolean is TRUE,which shows that there is NO DIFFERENCE between the 2 expressions.
bool areExpressionsTheSame = generatedExpr.ToString() == sameAsGeneratedExpr.ToString();
IQueryable<BookDto> queryable = dbContext.Books.Select(generatedExpr); // Throws an exception
//IQueryable<BookDto> queryable = dbContext.Books.Select(sameAsGeneratedExpr); // Works properly
var dtos = queryable.Select(b => new BookDto()
{
Name = b.Name,Author = new AuthorDto()
{
Name = b.Author.Name,Books = b.Author.Books.Select(b1 => new BookDto()
{
Name = b1.Name
}).ToList()
}
}).ToList(); // Note that this is the line that throws the exception,if that matters.
使用generatedExpr
会引发以下异常:
”当从“ VisitLambda”调用时,重写类型为 'System.Linq.Expressions.ParameterExpression'必须返回非null 相同类型的值。或者,覆盖“ VisitLambda”并 更改它以不访问此类儿童。”
我已经不知道是什么原因了,它们的表达方式是相同的,EF Core怎么能分辨出差异?!
谢谢。
提供商和版本信息:
- EF核心版本:5.0.0 RC1
- 数据库提供程序:Microsoft.EntityFrameworkCore.SqlServer
- 目标框架:.NET 5.0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。