【发布时间】:2020-05-19 07:02:23
【问题描述】:
我正在尝试通过 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();
}
不幸的是,它抛出了异常:“数据类型 text 和 varchar 在等于运算符中不兼容”但是,当我在 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-datatype 是“text”,这就是异常的原因,但是,不幸的是,更改 sql-datatype 不是一种选择,而且解决方法是“昂贵的”我希望能够以与 LINQPad 相同的方式运行它。
依赖Microsoft.Data.Sql.Client的版本是1.0.19.269.1。
提前致谢
【问题讨论】:
-
与LINQPad无关,而是使用的EF Core版本。看起来 ER Core 3.x 暗示的数据库类型与 LINQPad 使用的 EF Core 2.x 不同。
-
你可以试试
Like,但效率不高:.Where(a => EF.Functions.Like(a.InhaltKurzText, $"%{value}%")) -
@IvanStoev 两者都在使用 EF Core 3.1。
-
LINQPad 将参数类型推断为
nvarchar(16)(可能由 EF 调解)似乎毫无意义。如果您使用12345678901234567作为值会发生什么情况,它是否会提高到nvarchar(32)?如果知道基础列是text是varchar(max)(而不是text仅仅因为它匹配),那么可以说是最好的参数类型,但这是另一罐 bean。 -
您应该努力将数据类型
Text更改为现代替代品varchar(max)。自 SQL Server 2008 以来,Text数据类型已被弃用,它比当前最旧的受支持版本旧一个版本。如果更改 sql 数据类型不是一个选项,你最好把它作为一个选项,否则,它会在以后咬你。
标签: c# sql linq entity-framework-core linqpad