我的数据库中的员工号码开始以这种方式存储

EmployeeNumber
E123456
E999999
E666666
E111111
444444

有些值以"E"开头,有些则不是

我想写一个LINQ声明来将数据库DelivereNode与从Web传递的DelivereId进行匹配.我try 过这样写LINQ声明:

_akContext.EmployeeInfos.Where(e => e.EmployeeNumber.TrimStart('E') == employeeId).OrderBy(e => e.EmployeeInfoId).Select(e => e.EmployeeInfoId).ToList();

通过上面的LINQ声明,我不断收到一个错误:

.Where(e => e.EmployeeNumber.TrimStart(E) == __TrimStart_0)' could not be translated

以下是屏幕截图:

enter image description here

我能想到的唯一方法是循环访问数据库并删除所有"E",然后比较DelivereNode与DelivereId,但这将是两步过程.我想知道是否有办法在同一LINQ查询中修剪E并返回结果.如有任何建议,我们将不胜感激.

推荐答案

try 使用TrimStart overload accepting array of characters(based on the source code似乎可以翻译):

_akContext.EmployeeInfos
    .Where(e => e.EmployeeNumber.TrimStart(new []{'E'}) == employeeId)

尽管这种超载没有列出在Function Mappings of the Microsoft SQL Server Provider中.

如果这不起作用,您可以try 使用替换:

_akContext.EmployeeInfos
    .Where(e => e.EmployeeNumber.Replace("E", "") == employeeId)

其他选项包括在数据库中创建computed column,以保存修剪后的值或格式化数据客户端:

_akContext.EmployeeInfos
    .Where(e => e.EmployeeNumber == employeeId 
         || e.EmployeeNumber == ("E" + employeeId))

附注:

如果可能的话,我强烈建议在数据库中规范化数据(即从EmployeeNumber中删除E),或者至少考虑在EmployeeNumber的修剪版本上创建适当的索引.

Csharp相关问答推荐

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

禁用AutoSuggestBox项目更改时的动画?

ListaryImportProperty的默认DllImportSearchPathsProperty行为

C#自定义字典与JSON(de—)serialize

.NET HttpClient、JsonSerializer或误用的Stream中的内存泄漏?

自动映射程序在GroupBy之后使用项目

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

Docker Container中的HttpRequest后地址不可用

委托RequestDelegate不带2个参数-ASP.NET Core 8最小API

在C#中过滤Excel文件

try 链接被委派者(多播委托)时,无法将获取运算符应用于类型为';方法组&39;和方法组';的操作数

Google OAuth令牌交换在.Net中不起作用

在Windows Plesk上发布ASP.NET Core 7 Web API-错误:无法加载文件或程序集';Microsoft.Data.SqlClient';

.NET8->;并发词典总是比普通词典快...怎么回事?[包含基准结果和代码]

Blazor服务器项目中的Blazor/.NET 8/Web API不工作

C#如何获取字符串中引号之间的文本?

如何解决System.StackOverflowException:抛出System.StackOverflowException类型的异常.&# 39;生成随机代码时发生异常?

如何从原始图像到新创建的图像获得相同的特定 colored颜色 ,并且具有相同的 colored颜色 量和相同的宽度和高度?

在C#中删除多个不同名称的会话

根据运行时值获取泛型类型的字典