一尘不染

EF Core 3.1.1避免出现例外,“就像LINQPad 6一样,“数据类型text和varchar在等于操作符时是不兼容的”。

sql

我正在尝试通过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();
            }

不幸的是,它引发了一个例外:“当我在LINQPad 6中运行相同的表达式时,“数据类型text和varchar在等于运算符时不兼容”:

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-datatype是“ text”,这就是例外的原因,但是,由于不幸的是,更改sql-
datatype并不是一种选择,并且解决方法是“昂贵的”,我希望能够运行它就像LINQPad一样。

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

提前致谢


阅读 169

收藏
2021-05-16

共1个答案

一尘不染

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

根据SqlServer文档text数据类型已过时并表示

服务器代码页中的可变长度非Unicode数据,最大字符串长度为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日志生成的SQL完全相同(根据EF Core日志)

modelBuilder.Entity<Ausschreibungen>().Property(e => e.InhaltKurzText)
    .HasColumnType("text");

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

2021-05-16