首次使用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();
}
答案 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));
}
或者您可能需要进一步说明问题