C# efcore 3.1不支持使用字符串连接进行查询?

C# efcore 3.1不支持使用字符串连接进行查询?,c#,ef-core-3.1,C#,Ef Core 3.1,有没有办法通过将多个字段与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

有没有办法通过将多个字段与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和$“{}”仍然不起作用

await this.Db.ACoolDbSet.Where(y => y.Plums.ToString() + " " + y.Pears.ToString() == "LOL").ToListAsync();

字符串插值现在在EF Core 3.1中工作

await this.Db.ACoolDbSet.Where(y => $"{y.Plums} {y.Pear}" == "LOL").ToListAsync();

问题似乎是因为李子和梨是整数。添加y.Plums.ToString()和y.Pears.ToString()可以解决此问题。不幸的是,String.Format和$“{}”仍然不起作用。没有传统的字符串连接,事实上这是一种众所周知的错误做法。SQL注入攻击就是这样发生的。在这种情况下,尽管表达式很糟糕。即使ORM可以生成正确的查询,服务器也无法使用索引来加快速度,并且必须扫描整个表。您应该在问题本身中提到属性类型,并解释实际的查询是什么。你贴的东西永远不会是真的。比较值的好查询应该是Plums==someValue和Pears=someOtherValue。是的,我完全同意。查询永远不会返回任何内容。但在我看来,它仍然应该在服务器上执行,而不会抛出错误。另外,谢谢你提供的信息@PanagiotisKanavos@PanagiotisKanavos这确实有效。回答者本可以添加一些解释,而不是“试试这个”。@IvanStoev我没有看到评论说属性是整数。在这种情况下,没有理由将它们转换为字符串,只需使用两个copmarison和
我认为这是EF Core 3错误。原始表达式映射到
String.Concat(object,object)
。后者映射到
String.Concat(String,String)
。显然,他们的新翻译器支持后者,但前者失败。@IvanStoev前者在SQL中没有任何意义-
CONCAT
使用字符串。在使用
CONCAT
之前,必须将值转换为字符串。如果最初的工作正常,那只是因为客户端的计算。@IvanStoev或者它可能确实是空映射中的一个错误<如果这些字段中有一个
NULL
值,code>CONCAT
将返回
NULL
。不过,字符串插值会将空字符串视为空字符串。那么这里的预期行为是什么呢?不管是什么,ORM窒息了你现在是什么意思?EF核心5?6?@martonx更新了答案,称其目前在EF core 3.1中工作