【发布时间】:2020-02-26 08:39:32
【问题描述】:
有没有办法通过使用 String.Format 或 $"{}" 或只是传统的 "" + "" + "" 将多个字段连接在一起来使用 EFCore 3.1 进行查询?
我有这个代码:
await this.Db.ACoolDbSet.Where(y => y.Plums + " " + y.Pears == "LOL").ToListAsync();
Plums 和 Pears 是整数。
这会导致这个错误:
System.InvalidOperationException: 'Null TypeMapping in Sql Tree'
这是预期的吗?
This exception was originally thrown at this call stack:
Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.SqlTypeMappingVerifyingExpressionVisitor.VisitExtension(System.Linq.Expressions.Expression)
System.Linq.Expressions.Expression.Accept(System.Linq.Expressions.ExpressionVisitor)
System.Linq.Expressions.ExpressionVisitor.Visit(System.Linq.Expressions.Expression)
Microsoft.EntityFrameworkCore.Query.SqlExpressions.SqlBinaryExpression.VisitChildren(System.Linq.Expressions.ExpressionVisitor)
System.Linq.Expressions.ExpressionVisitor.VisitExtension(System.Linq.Expressions.Expression)
Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.SqlTypeMappingVerifyingExpressionVisitor.VisitExtension(System.Linq.Expressions.Expression)
System.Linq.Expressions.Expression.Accept(System.Linq.Expressions.ExpressionVisitor)
System.Linq.Expressions.ExpressionVisitor.Visit(System.Linq.Expressions.Expression)
Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.Translate(System.Linq.Expressions.Expression)
Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateExpression(System.Linq.Expressions.Expression)
...
[Call Stack Truncated]
添加 y.Plums.ToString() 和 y.Pears.ToString() 解决了这个问题。不幸的是,String.Format 和 $"{}" 仍然无法正常工作
【问题讨论】:
-
看来问题是因为 y.Plums 和 y.Pears 是整数。添加 y.Plums.ToString() 和 y.Pears.ToString() 解决了这个问题。不幸的是,String.Format 和 $"{}" 仍然无法正常工作。
-
没有传统的字符串连接,事实上这是一种众所周知的坏习惯。这就是 SQL 注入攻击的发生方式。在这种情况下,虽然表达方式很糟糕。即使 ORM 可以生成正确的查询,服务器 也无法使用索引来加快速度,并且必须扫描整个表。
-
您应该在问题本身中提及属性类型,并解释实际查询是什么。您发布的内容永远不会是真实的。一个好的查询比较值应该只是
Plums==someValue AND Pears=someOtherValue。 -
是的,我完全同意。查询永远不会返回任何内容。但在我看来,它仍然应该在服务器上执行而不会引发错误。附言。谢谢你的信息,@PanagiotisKanavos
标签: c# ef-core-3.1