代码之家  ›  专栏  ›  技术社区  ›  Anjali

在LINQ中放入trim语句

  •  1
  • Anjali  · 技术社区  · 1 年前

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

    EmployeeNumber
    E123456
    E999999
    E666666
    E111111
    444444
    

    有些值以“E”开头,有些则不然

    我想写一个LINQ语句,将数据库EmployeeNumber与从web传递的employeeId进行匹配。我试着这样写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”,然后将EmployeeNumber与employeeId进行比较,但这将是两步过程。我想知道是否有任何方法可以在同一个LINQ查询中修剪E,然后返回结果。如有任何建议,我们将不胜感激。

    2 回复  |  直到 1 年前
        1
  •  4
  •   Guru Stron    1 年前

    尝试使用 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 .

    如果这不起作用,您可以尝试使用replace来解决:

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

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

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

    附笔。

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

        2
  •  0
  •   Jon Skeet    1 年前

    在我看来,你似乎是从错误的角度来处理这个问题的。即使有效,修剪是否有意义 每一个 数据库中的值?当然,弄清楚员工的工作方式要简单得多 在数据库中进行格式化,然后利用数据库索引等与之进行直接比较:

    // Add any extra logic here such as padding.
    var prefixedEmployeeId = $"E{employeeId}";
    // Again, potentially apply zero-padding. The use
    // of a separate variable name makes the purpose clearer.
    var unprefixedEmployeeId = employeeId */;
    
    var employees = _akContext.EmployeeInfos
        .Where(e => e.EmployeeNumber == prefixedEmployeeId ||
                    e.EmployeeNumber == unprefixedEmployeeId)
        .OrderBy(e => e.EmployeeInfoId)
        .Select(e => e.EmployeeInfoId)
        .ToList();
    

    如果您的员工ID被格式化,那可能会有问题 真正地 在数据库中不一致,(例如,一些使用 E ,一些使用 EE ,有些不使用 E 完全),但我真的会 希望 事实并非如此。如果只是“一些E前缀”和“一些非E前缀”的情况,那么在查询中同时显示这两种情况应该没问题——我仍然认为这比修剪要好。不过,将数据库修复为一致肯定会更好。。。