2011-11-04 43 views
6

说我有3个客户姓名:LINQ的 - 通过StartsWith订单则包含

Microsoft 
Another customer also called Microsoft 
A third customer called Microsoft 

现在,如果我查询的客户是这样的...

var q = (from cust in db.Cust 
        where cust.Name.Contains("Microsoft") 
        orderby cust.Name ascending 
        select cust) 

...我得到这个顺序:

A third customer called Microsoft 
Another customer also called Microsoft 
Microsoft 

我想要的是基于它以“Microsoft”开头的事实得到Microsoft第一。

变迁包含对StartsWith当然给我留下了个结果,而不是3

难道这在单个查询做到吗?

+0

我不这么认为,你几乎需要使用全文查询加权。 – Sam

+0

@Sam - 我放弃了全文搜索。在搜索中使用空格时,它让我头疼。 – Malako

回答

14

也许

var q = (from cust in db.Cust 
        where cust.Name.Contains("Microsoft") 
        orderby cust.Name.IndexOf("Microsoft"), 
          cust.Name.Length ascending 
        select cust) 
+0

哇,太快了!优雅! – Malako

+0

这是针对您的问题的非常好的解决方案。 –

3

你可以通过匹配百分比排序。

orderby "Microsoft".Length * 1.0/cust.Name.Length 

这将产生100%,只是微软和多的其他比赛少。

+0

a微软获得与MicrosoftB相同的权重,采用这种方法 –

+0

有趣的解决方案。需要添加降序。竖起大拇指! – Malako

+0

@Valentine - 这就对了。我会坚持你的解决方案。 – Malako