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

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

这工作得很好,并返回表上所需的行,所以我知道一个事实,即项目存在.

然后,我try 从我的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. Replication"的转换失败.如果此方法可以映射到您的自定义函数,请参见https://go.microsoft.com/fwlink/?linkid=2132413以获取更多信息.以可翻译的形式重写查询,或通过插入对'AsEnumerable'、'AsAsAsyncEnumerable'、'ToList'或'ToListAsync'的调用显式切换到客户端判断.https://go.microsoft.com/fwlink/?linkid=2101038了解更多信息"

我的理解是LINQ不能将查询转换为SQL,这是公平的,但老实说,我只使用在LINQ中工作的方法,string.Concat()产生的结果和简单的+相同.

事实上,错误是专门抱怨SqlFunctions#Replicate,这是一个方法,特别是不可能在"LINQ to Entities"查询之外调用,这使得这个问题更加混乱.

有什么建议吗?

推荐答案

SqlFunctions.ReplicateSystem.Data的一部分,没有翻译.EF Core模拟是EF.Functions,但目前它没有SQL Server REPLICATE的选项(参见this github issue).

作为解决方案,你可以考虑现在写一个user-defined function mapping.例如:

class MyContext : DbContext
{  
    [DbFunction("REPLICATE", IsBuiltIn = true)]
    public static string Replicate(string s, int i) => throw new Exception();
    // ...
}

var firstOrDefault = myContext.Entities
    .Where(k => k.SomeId == 255080)
    .Select(k => new
    {
        k.SomeId,
        S = MyContext.Replicate(k.SomeString, 10 - k.SomeInt)
    })
    .FirstOrDefault();

另见:

Csharp相关问答推荐

.NET通过版本自动增量设置包版本

Rx.Net -当关闭序列被触发时如何聚合消息并发出中间输出?

更新数据库中的对象失败,原因是:Microsoft. EntityFrame Core. GbUpdateConcurrencyResponse'

并行令牌更新

不仅仅是一个简单的自定义按钮

如何在Windows 11任务调度程序中每1分钟重复一次任务?

C#方法从AJAX调用接收NULL

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

无法通过绑定禁用条目

如何捕获对ASP.NET核心应用程序的所有请求并将其发送到一个页面

NET8 MAUI并部署到真实设备上进行测试

反序列化私有成员

Linux Docker上的.NET6在某个时间抛出后,在加密操作期间发生System.Security.Cryptography.CryptographicException:错误

在try 使用访问服务器上的文件夹时,如何解决CORS错误.NET核心API

KeyDown从我的文本框中删除输入,如何停止?

c#在后台实现类型化数组

DropDownListFor未显示选定值

仅在Blazor Web App中覆盖生产的基本路径(.NET8中的_Hosts.cshtml文件功能?)

将两个JSON文件与覆盖值的主文件合并

C#LINQ多行条件