【发布时间】:2019-06-14 04:01:01
【问题描述】:
第一次使用 c# 和 Linq。我有一根绳子通过我的路线进来。我想在几个不同的列中搜索字符串中的值。假设我将每个单词拆分为一个空格,foreach 我想动态地将.Where 添加到我的 linq 语句中。我想我可能还需要动态添加.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();
}
【问题讨论】:
-
Or将成为Where的一部分,不是吗?喜欢.Where(x => x == "a" || x == "b") -
您可以使用Expression Tree,也可以使用Dynamic Linq
-
但是我该如何防止它覆盖已经包含在
results.@John 中的数据 -
@ChristopherMellor John 的示例向您展示了如何操作。不要说
results = this,然后是results = that。只需获取一次结果并查找u.Name.Contains(r) || u.Text.Contains(r)。这将创建一个包含所有匹配元素的列表。还有.addRange()- 无论哪种方式都可以,但我会选择1-off查询。 -
@Christopher 你不是在覆盖,而是在链接。
.Where(a => a.Opt1 == true).Where(a => a.Opt2 = false)等价于.Where(a => a.Opt1 == true && a.Opt2 == false)
标签: c# .net linq linq-to-sql