我正在尝试通过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。
提前致谢
这似乎是由EF Core 3.x基础结构和/或SqlServer提供程序中的某些更改引起的。LINQPad无关紧要,因为它只是将LINQ查询委托给基础框架(在您的情况下,显然是EF Core 2.x)。
根据SqlServer文档,text数据类型已过时并表示
text
服务器代码页中的可变长度非Unicode数据,最大字符串长度为2 ^ 31-1(2,147,483,647)。
因此,即使数据库类型为text,您也可以在EF Core中将其映射为varchar(2^31-1)
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");
但可以成功运行,而后者会生成有问题的运行时异常。