2013-10-27 150 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")); 
相关问题