2013-10-27 206 views
2

我正在使用實體框架從數據庫中檢索數據。C#,按字母順序對LINQ結果進行排序,然後根據搜索關鍵字進行排序

結果按輸入到搜索文本框中的值進行過濾。

var searchKey = this.TextBoxSearch.Text; 

var products = this.databaseManager.Products.Where(x => x.Name.Contains(searchKey)).Select(x => x.Name); 

然後結果按字母順序排序。

products = products.OrderBy(x => x); 

現在我想以某種方式對結果進行排序;包含搜索關鍵字的結果在其開頭處於包含文本中其他地方的搜索關鍵字之前的結果。

實施例:

當用戶鍵入「IP」 過濾結果應爲波紋管:

iPhone 4S,iPhone 5,所有在一個IP電話......

當然在正常情況下所有在一個iP電話是列表中的第一項。因爲結果按字母順序排序。但在我的情況。用戶的搜索鍵必須占主導地位。

這可能使用C#Linq [.NET 4.5],或者在SQL Server中?如果這可以用SQL查詢來完成,那也是很好的。

+3

查找搜索關鍵字的結果根據索引設置和排序的指標。 – Sameer

+0

@Mokchhya,我想要一樣的,但究竟是如何做到這一點?在哪個方面有問題? –

+0

@rabar,請參閱下面的答案。 – Sameer

回答

1
var products = this.databaseManager.Products.Where(x => x.Name.Contains(searchKey)).Select(x => new {Name=x.Name,Index=x.Name.IndexOf(searchKey)}).OrderBy(a=>a.Index).ToList(); 
+0

這工作正常,謝謝 –

+0

@Mokchhya。非常感謝你。 –

-1

這應該在你的情況下工作:

products = products.OrderBy(p => p.StartsWith("iP") ? 1 : 2).ThenBy(p => p); 
+0

如果搜索字符串被發現在中間或結束,那麼結果列表將不會按升序排列,因爲OP想要... –

+0

事實上,我只關心「iP」在開頭。 –

2

這應該工作:

var ordered = products.OrderBy(p => p.IndexOf("iP")); 
相關問題