如何多次过滤Objectset?

时间:2013-03-17 21:02:59

标签: c# linq iqueryable

我有一个表示一组人的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);

但它似乎只适用于最后一场比赛“大卫”。

我如何完成我需要做的事情?欢迎任何不同或更简单的解决方案。如果重要,网格是只读的,所以我不必担心绑定/编辑注意事项。

1 个答案:

答案 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();