1

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

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

4

2 回答 2

0

这里有两点需要注意:

  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();
}
于 2018-10-02T11:35:04.420 回答
0

@HeyJude 感谢您的努力,但我仍然无法正常工作。它以某种方式出错了,现在我什至无法获取仅给出 ProcessId 编号的正确行..

让我给你更详细的描述我的设置。在数据库中有一个包含“NewValue”列的表,我使用此列来存储某个对象的当前(用于在表中创建行的时间)表示的 json 字符串,例如对象Process。因此,该列存储例如{"ProcessId":904,"ProcessLength":1000}的字符串。为了从 db 中获取这些数据,我创建了表记录的集合: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 列包含查询字符串的所有记录,但这不起作用。它编译并“工作”,但没有获取数据或仅获取 904 稍后出现在字符串中的那些记录。

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

于 2018-10-07T18:49:00.833 回答