EF Core 3.1.1 像 LINQPad 6 一样避免异常 "The data types text and varchar are incompatible in the equal to operator"

EF Core 3.1.1 Avoiding the exception "The data types text and varchar are incompatible in the equal to operator" just as LINQPad 6 does

我正尝试通过 Entity Framework Core 3.1.1 运行 这个 LINQ 表达式。

 using (Text3Context text3Context = new Text3Context(_constringText3))
            {
                var aus = text3Context.Ausschreibungen.Where(a => a.InhaltKurzText.Contains(value)).Select(c => c.InhaltKurzText).ToList();
            }

不幸的是,它抛出异常:"The data types text and varchar are incompatible in the equal to operator" 但是,当我 运行 LINQPad 6 中的相同表达式时:

string value = "test";
var aus = Ausschreibungen.Where(a => a.InhaltKurzText.Contains(value)).Select(c => c.InhaltKurzText);
aus.Dump();

它完美无误。

如您所见,sql-查询略有不同:

Linq/EF核心:

SELECT [a].[InhaltKurzText]
FROM [dbo].[Ausschreibungen] AS [a]
WHERE (@__value_0 = '''') OR (CHARINDEX(@__value_0, [a].[InhaltKurzText]) > 0)',N'@__value_0 text',@__value_0='test'

LINQPad:

SELECT [a].[InhaltKurzText]
FROM [Ausschreibungen] AS [a]
WHERE ((@__value_0 = N'''') AND @__value_0 IS NOT NULL) OR (CHARINDEX(@__value_0, [a].[InhaltKurzText]) > 0)',N'@__value_0 nvarchar(16)',@__value_0=N'test'

如何像 LINQPad 一样处理此查询?

"InhaltKurzText" 的 sql-数据类型是 "text",这就是异常的原因,但是,不幸的是,更改 sql-数据类型不是一个选项,解决方法是 "expensive" 我希望能够像 LINQPad 一样 运行 它。

依赖的版本Microsoft.Data.Sql.Client是1.0.19.269.1。

提前致谢

这似乎是由 EF Core 3.x 基础结构 and/or SqlServer 提供程序的某些更改引起的。 LINQPad 是无关紧要的,因为它只是将 LINQ 查询委托给底层框架(在您的情况下显然是 EF Core 2.x)。

根据 SqlServer documentationtext 数据类型已过时并表示

Variable-length non-Unicode data in the code page of the server and with a maximum string length of 2^31-1 (2,147,483,647).

因此,即使数据库类型为 text,您也可以在 EF Core 中将其映射为 varchar(2^31-1)

modelBuilder.Entity<Ausschreibungen>().Property(e => e.InhaltKurzText)
    .IsUnicode(false)
    .HasMaxLength((1 << 31) - 1);

有趣的是,生成的 SQL 与

生成的完全相同(根据 EF Core 日志)
modelBuilder.Entity<Ausschreibungen>().Property(e => e.InhaltKurzText)
    .HasColumnType("text");

但运行成功,而后者生成有问题的运行时异常。