LINQ 无法转换 SqlFunctions 方法

问题描述 投票:0回答:1

我的 C# 应用程序有问题。我正在尝试从 SQL Server 数据库中获取项目,在数据库中我可以使用以下查询:

SELECT *
FROM [table]
WHERE [field] IS NOT NULL 
    AND [field] != '' 
    AND CONCAT(REPLICATE('0', 10 - LEN([field])), [field]) = 'literal'

这工作得很好,并返回表格上所需的行,所以我知道该项目存在。

然后我尝试从 C# 后端访问相同的数据,我通过 LINQ 表达式执行此操作,如下所示:

var literal = 'xxxxx'
desired = dbContext.dbSet.Where(x => x.field != null && x.field != "" && (
    string.Concat(SqlFunctions.Replicate("0", 10 - x.CodigoProductoCia.Length), x.CodigoProductoCia) == literal
)

前面的代码片段产生以下异常消息:

LINQ 表达式

DbSet<Entity>().Where(p => p.field != null && p.field != "" && SqlFunctions.Replicate(target: "0", count: (int?)(10 - p.CodigoProductoCia.Length)) + p.CodigoProductoCia == "")
无法翻译。

其他信息:方法“System.Data.Entity.SqlServer.SqlFunctions.Replicate”的转换失败。如果此方法可以映射到您的自定义函数,请参阅 https://go.microsoft.com/fwlink/?linkid=2132413 了解更多信息。以可翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端计算。请参阅 https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。'

我的理解是 LINQ 无法将查询转换为 SQL,这是公平的,但老实说,我只使用在 LINQ 中工作的方法,并且

string.Concat()
产生与简单的
+
相同的结果。

事实上,该错误是专门抱怨

SqlFunctions#Replicate
的,这是一种在“LINQ to Entities”查询之外无法调用的方法,这使得这更加令人困惑。

有什么建议吗?

c# sql-server linq
1个回答
0
投票

SqlFunctions.Replicate
System.Data
的一部分,未翻译。 EF Core 模拟是
EF.Functions
,但目前它没有针对 SQL Server 的
REPLICATE
选项(请参阅此 github 问题)。

作为解决方法,您现在可以考虑编写一个 用户定义的函数映射

另请参阅 Microsoft SQL Server Provider 的函数映射

© www.soinside.com 2019 - 2024. All rights reserved.