我有一个表示一组人的Objectset,我想将它用作DataGridView控件的DataSource。但在此之前,我想根据搜索字符串过滤一组人。因此,如果搜索字符串是“David John”,我会想要保留“David Johnson”和“John Davidson”,而不是“John Williams”,“David Beckham”或“Al Green”。
这是我尝试过的:
MyObjectContext context = GetContext();
string searchBox = "John David";
Regex regex = new Regex("[a-zA-Z]+", RegexOptions.Singleline);
MatchCollection matches = regex.Matches(searchBox);
IQueryable<Owner> q = ce.Owner;
foreach (Match match in matches)
{
q = q.Where(o => o.FirstName.Contains(match.Value)
|| o.LastName.Contains(match.Value));
}
findOwnerDataGrid.DataSource = q.OrderBy(o => o.LastName);
但它似乎只适用于最后一场比赛“大卫”。
我如何完成我需要做的事情?欢迎任何不同或更简单的解决方案。如果重要,网格是只读的,所以我不必担心绑定/编辑注意事项。
答案 0 :(得分:3)
我会在没有正则表达式的情况下使用LINQ to Objects。
var items = new List<string>() {
"David Johnson", "John Davidson", "John Willians", "David Beckham", "Al Green"
};
var queryString = "David John";
var queryItems = queryString.Split(new char[] { ' ' });
var results = items.Where(x => queryItems.All(q => x.Contains(q))).ToList();
返回你想要的东西。
对于您的List<Owner>
查询,可能就是这样:
var results = items.Where(x => queryItems.All(q => x.FirstName.Contains(q) ||
x.LastName.Contains(q)))
.ToList();