2012-08-01 51 views
2

我需要創建一個函數來接收一個字符串列表,並返回匹配的所有項目的列表(即SQL「LIKE」,區分大小寫並忽略變音符號):實體框架中的複雜動態查詢

// Pseudocode example 
IEnumerable<Item> Search(List<String> patterns) 
{ 
    var result = new List<Item>(); 

    foreach (var Item in context.Items) 
    { 
     bool matches = true; 

     foreach (var pattern in patterns) 
     { 
      if (!Item.Name.Contains(pattern)) 
      { 
       matches = false; 
       break; 
      } 
     } 

     if (matches) 
     { 
      result.Add(Item); 
     } 
    } 

    return result; 
} 

雖然類似這樣的工作,但它不理想(這似乎非常低效)。

是否有可能創建生成類似於下面的SQL東西?:

SELECT * 
FROM items 
WHERE items.name LIKE :pattern1 
    AND items.name LIKE :pattern2 
    ... 
    AND items.name LIKE :patternN 

回答

3

你可以簡單地重複你的模式和應用WHERE子句每一個(可能是LINQ)查詢。

var patterns = new List<string>(); 
using (var context = new MyDataContext()) 
{ 
    var query = (IQueryable<Area>)context.Areas; 

    foreach (var pattern in patterns) 
    { 
     query = query.Where(a => a.Description.Contains(pattern)); 
    } 

    return query.ToList(); 
} 

正如你可能知道,查詢是懶惰執行的,在這種情況下不會直到ToList調用應用了所有的圖案後執行。

+0

問題的另一部分呢?包含處理變音符號,還是有一種方法? – Tordek 2012-08-06 08:54:58

+1

@Tordek你可以用'StringComparer.CurrentCultureIgnoreCase'指定一個不區分大小寫的匹配項,但我不知道變音符號。說實話,我不希望他們可以很容易地處理,你可能需要一個映射模式來映射(例如)*á*到* a *。 – 2012-08-10 12:04:17