如何向Linq查询动态添加Where和Or语句

时间:2019-06-14 04:01:01

标签: c# .net linq linq-to-sql

首次使用c#和Linq。我的路线上有一根绳子进来。我想在几个不同的列中搜索字符串中的值。假设我要在空格上分割每个单词,foreach这些项之一我想动态地向我的linq语句中添加一个.Where。我认为我可能还需要动态添加一个.Or

foreach (string q in query)
{
    results = results.Where(u => u.Name.Contains(r));
    results = results.Where(u => u.Text.Contains(r));
}

我已经习惯了JS,在这里您可以做类似results += results.Where(...)的事情,但我不确定使用linq构造这种事情的适当方法。

编辑:为清晰起见,这是整个方法

            using (var context = new MessageContext())
        {
            string[] words = query.Split(" ");
            var messages = (from m in context.Messages
                          join u in context.Users on m.UserId equals u.UserID
                          select new
                          {
                              m.Id,
                              m.Date,
                              m.Name,
                              m.Text,
                              m.UserId,
                              u.Image
                          });

            foreach (string word in words)
            {
                messages = messages.Where(u => u.Name.Contains(word)).Union(messages.Where(u => u.Text.Contains(word)));

            return messages.ToList();
        }

2 个答案:

答案 0 :(得分:1)

Linq使用惰性求值(直到您开始遍历结果或调用诸如ToList()之类的方法时,才对结果求值。)正如John指出的那样,每个后续调用实际上只是在修改搜索条件。因此在您的示例中

results = results.Where(u => u.Name.Contains(r));
results = results.Where(u => u.Text.Contains(r));

等效于

results = results.Where(u => u.Name.Contains(r)).Where(u => u.Text.Contains(r));

表示 AND 条件。如果需要 OR 条件,则需要我们Union运算符。

results = results.Where(u => u.Name.Contains(r)).Union(results.Where(u => u.Text.Contains(r)));

这种懒惰评估的好处在于,您可以提取基本查询并添加其他搜索条件,从而简化代码。

我希望这会有所帮助。

答案 1 :(得分:0)

foreach (string q in query)
{
   results = results.Where(u => u.Name.Contains(r) || u.Text.Contains(r));
}

或者您可能需要进一步说明问题