2012-10-02 85 views
2

我有一個數據庫,其中包含像firstname lastname street和searchfield這樣的字段。匹配搜索領域將是我的搜索子集在這裏,任何事情都是LINQ的邏輯:使用linq匹配多個字段時優先考慮字段

if (!String.IsNullOrEmpty(searchString)) 
{ 
    folders = folders.Where(p => p.SearchField.ToLower().Contains(searchString.ToLower())); 
} 

我可以通過名稱或姓名或任何訂購。

現在我想介紹結果,以便優先考慮與我的搜索詞相關的名稱字段。

例如,如果我找施密德我首先要表明與匹配施密德是那麼名字,然後在街上姓氏的人...等

任何想法?

+1

我想你會在這裏找到你要找的東西:http://stackoverflow.com/questions/3760001/linq-orderby-versus-thenby –

+0

是的,它是有用的,但不符合我想要的做。假設你有schmid(firstname)arnaud(lastname),john schmid,alex schmid,那麼第一個將是schmid arnaud,而且我希望第一個是alex schmid,然後是john schmid ..等等。我想把schmid作爲firstname然後作爲姓...等 –

+2

啊,我明白你的意思了。對於字符串搜索,您匹配多個字段,並且您希望首先匹配一些字段。 –

回答

3

我希望我理解正確的話

var res = 
    folders 
     .Where(item => item.FirstName == name) 
     .Union(folders.Where(item => item.LastName == name)) 
     /* Add more Union-Where statements */ 
     ; 
+0

是的,這是非常感謝,它非常好。但如果你明白我的意思,我還需要休息一下。我可以做到這一點:res = res.Union(folders.Except(res))但它很醜陋...你有更好的主意嗎? –

+0

只是聯合'res'與'文件夾'...聯盟將區分收集 –

1

我認爲最好的辦法是讓匹配的對象,然後再在內存中進行:

var lower = searchString.ToLower(); 
folders = folders 
      .Where(p => p.SearchField.ToLower().Contains(lower)) 
      .ToArray(); 
folders = folders 
      .OrderBy(f => !f.LastName.Contains(lower)) 
      .ThenBy(f => !f.FistName.Contains(lower)) 
      .ThenBy(f => !f. ... 

如果你做的所有OrderBy的在IQueryable查詢可能會炸燬,而初始過濾器是使用數據庫引擎最重要的事情。

請注意,你不能總是顯示LastName然後那些火柴匹配lowerFistName等的項目,因爲有可能是在這兩個比賽的項目。我不認爲你想重複項目,是嗎?

+0

感謝您的回答我不明白爲什麼,但這是該死的慢,當我嘗試 –

+0

可能是因爲所有lambda表達式運行的每個項目列表,所以這是很多數據處理。也許一個完整的數據庫引擎解決方案(沒有'ToArray')和更長的查詢是最好的。 –