2013-03-17 76 views
1

我有一個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

[我想你打這裏的問題(http://stackoverflow.com/questions/8898925/is-there-a-reason - 用於-CS-重用的最可變IN-A-的foreach/8899347#8899347)。如果你將'match'賦給'foreach'中的局部變量,並在lambda表達式中引用它,那麼我想你的原始代碼會起作用。 – 2013-03-18 07:41:55

+0

感謝Martin的洞察力。它把奇怪的行爲帶出了神祕的面紗。 – 2013-03-18 12:29:27

回答

3

我會使用LINQ到沒有正則表達式的對象。

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(); 
+0

看起來不錯!我會給它一個機會 – 2013-03-17 21:12:31

+0

感謝您的幫助Marcin – 2013-03-17 21:54:05