where 子句中的动态 linq 反斜杠

Dynamic linq backslash in where clause

我使用 System.Linq.Dynamic 来查询具有动态 'where' 表达式的实体。我正在查询具有 属性 "newValue" 字符串类型的对象。示例值为:“{\"ProcessId\":764, \"ProcessLength\":1000}”。 我不能使用 ==,因为我想找到 属性 包含 "ProcessId:764" 的所有命中,而不管字符串的其余部分。问题是,存储的字符串包含转义符号“\”和双引号,我无法弄清楚它到底应该是什么样的..

dbContext.Processes.Where("@newValue.Contains(\"ProcessId\":764\")") 带来错误,但是 dbContext.Processes.Where("@newValue.Contains(\":764\")") 工作正常。我猜它一定是我的查询中带有反斜杠或双引号的东西,但我自己无法弄清楚..

这里有两点需要注意:

  1. 如果您在编译时知道应该查询的列(即 newValue),只需使用标准 Linq:var list = items.Where(i => i.NewValue.Contains("904")).ToList().

  2. 如果你确实想使用动态 Linq,你通常想要的是在某些列上应用 Where,例如Where("SomeColumn.Contains("something")"),或 Where("SomeColumn.Contains(@0)", new string[] {"something"})

    因此,对于您的情况,这应该有效:items.Where("newValue.Contains(\"904\")")

    Where("@newValue.Contains("something")") 没有任何意义,因为 @newValue 会被解析为字符串文字。另请参阅此 上的类似问题。

这是一个简单的例子:

public static void Main(string[] args)
{
    var items = new [] 
    { 
       new { Id = "1", Title = "ProcessId: 123"}, 
       new { Id = "4", Title = "ProcessId: 456"}, 
       new { Id = "7", Title = "ProcessId: 789"}, 
    }.ToList();

    // returns null, because the string "Title" doesn't contain the string "7"
    var res1 = items.Where("@0.Contains(\"7\")", new string[] {"Title"}).FirstOrDefault();     

    // works - returns the 3rd element of the array
    var res2a = items.Where("Title.Contains(@0)", new string[] {"ProcessId: 789"}).FirstOrDefault();                 
    var res2b = items.Where("Title.Contains(\"ProcessId: 789\")").FirstOrDefault();
}

@HeyJude 感谢您的努力,但我仍然无法正常工作。它不知何故变得错误,现在我什至无法获取仅提供 ProcessId 编号的正确行..

让我更详细地描述一下我的设置。在数据库中有一个 table 列 "NewValue",我用这个列来存储 json 当前字符串(在 table 中创建行时)一些表示对象,例如对象 进程 。因此该列存储例如 {"ProcessId":904,"ProcessLength":1000} 的字符串。为了从数据库中获取此数据,我创建了 table 记录的集合:var items = (from l in db.JDE_Logs join u in db.JDE_Users on l.UserId equals u.UserId join t in db.JDE_Tenants on l.TenantId equals t.TenantId where l.TenantId == tenants.FirstOrDefault().TenantId && l.Timestamp >= dFrom && l.Timestamp <= dTo orderby l.Timestamp descending select new //ExtLog { LogId = l.LogId, TimeStamp = l.Timestamp, TenantId = t.TenantId, TenantName = t.TenantName, UserId = l.UserId, UserName = u.Name + " " + u.Surname, Description = l.Description, OldValue = l.OldValue, NewValue = l.NewValue });。然后我查询它以找到给定 ProcessId 编号的匹配行,例如query = "@NewValue.Contains(\"904,)\")"; items = items.Where(query); 这应该取回 NewValue 列包含查询字符串的所有记录,但这不起作用。它编译并且 'works' 但没有数据被提取或提取只是 904 出现在字符串后面的那些记录。听起来很愚蠢,但事实就是如此。

要获取包含 "ProcessId":904 的所有记录,查询字符串应该是什么样子?