我的 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”查询之外无法调用的方法,这使得这更加令人困惑。
有什么建议吗?
SqlFunctions.Replicate
是 System.Data
的一部分,未翻译。 EF Core 模拟是 EF.Functions
,但目前它没有针对 SQL Server 的 REPLICATE
选项(请参阅此 github 问题)。
作为解决方法,您现在可以考虑编写一个 用户定义的函数映射。