【问题标题】:.Net Core 3.1 Linq to Entities - How to concat strings in where clause.Net Core 3.1 Linq to Entities - 如何在 where 子句中连接字符串
【发布时间】:2020-06-05 02:57:18
【问题描述】:

我有一个包含 [FirstName] 和 [LastName] 列的用户表。 我正在尝试构建一个搜索功能,以返回满足以下条件之一的用户:

  • FirstName == myPattern,或
  • 姓氏 == myPattern,或
  • FirstName LastName == myPattern

例如,如果我的数据库中有以下用户:

  • 杰克一号
  • 杰克二
  • 杰克三

我希望函数在输入为 Jack 时返回所有这些,但仅在输入为 Jack One

时返回 Jack One

我目前有以下代码:

var users = context.User.Where(x => x.FirstName == pattern 
            || x.LastName == pattern
            || x.FirstName + " " + x.LastName == pattern)

但这不起作用,因为它被转换为 MySQL 中的以下查询

...WHERE (`p`.`firstName` = 'Jack One') OR (`p`.`lastName` = 'Jack One')) OR (((`p`.`firstName` + ' ') + `p`.`lastName`) = 'Jack One')

它不起作用,因为我认为如果我想在 MySQL 中连接多个字符串,我们需要使用 CONCAT(firstName, ' ', lastName)。

我尝试使用以下 .NET 函数,但它们无法翻译为 sql(无法翻译 LINQ 表达式...。要么以可翻译的形式重写查询,要么通过插入显式切换到客户端评估调用 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync())

  • string.Join(' ', firstName, lastName)
  • string.Concat(firstName, " ", lastName)

我如何在 .NET CORE 3.1 中实现这一点将所有数据拉入内存并在客户端进行评估?

谢谢

【问题讨论】:

    标签: mysql entity-framework .net-core linq-to-entities


    【解决方案1】:

    这看起来像是 Linq 以您无法预测的方式翻译查询的情况。

    从内存中去,并且手头没有 IDE 来检查它,但是试一试。如果先在空格上拆分全名,则可以使用查询中的值。

    // returns an array based on the patter, if it can be split
    var names = pattern.Split(" ");
    
    // then use the array elements in the query
    var users = context.User.Where(x => x.FirstName == pattern 
        || x.LastName == pattern
        || (x.FirstName == names[0] && x.LastName == names[1]));
    

    查询的最后一个 OR 条件应该评估 names 数组中的 2 个新元素,它们是根据模式创建的

    【讨论】:

    • 感谢您的想法。虽然这在大多数情况下都有效,但它不适用于名字或姓氏中有空格的用户(例如“Jack Bob One”)。中间名或非英文名的用户可能会发生这种情况。
    • 好点。处理所有情况会导致一些错误。也许在数据库端设置一个存储过程来检查视图的值而不是?这会将连接转移到数据库上,您可以将名称作为参数传递。
    • 是的,这会起作用...我只是想知道目前是否有办法在 .Net Core 中做到这一点。
    【解决方案2】:

    这似乎是 MySql.Data.EntityFrameworkCore 的一个错误。

    我改用Pomelo.EntityFrameworkCore.MySql 来解决问题。

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多