2013-04-16 172 views
0

我想要搜索用戶數據庫並根據匹配的精確程度對結果進行排序。作爲一個例子,在單個詞匹配之前,應該在結果中出現用戶名的完全匹配。將多個查詢的結果合併爲單個查詢

這是我(變量「值」包含一個搜索詞,「查詢」包含初始可查詢我想修改)

 var values = value.Split(new [] {' ','\t', '\n', '\r'}); 

     var q1 = query.Where(u => u.Id == valueAsInt || u.ExternalId == valueAsInt); 
     var q2 = query.Where(u => u.Name.Contains(value) || u.Username.Contains(value)); 
     var q3 = query.Where(u => values.All(i => u.Name.Contains(i)) || values.All(i => u.Username.Contains(i))); 
     var q4 = query.Where(u => values.Any(i => u.Name.Contains(i)) || values.Any(i => u.Username.Contains(i))); 

不過,我現在想Q1的結果結合起來通過Q4,並有一個新的查詢,我可以傳遞。我也想保持自己的查詢的順序,並坦率地說,我不知道如何去這樣做..

+1

您可以嘗試連接結果。我不確定訂單是否保留。 var qAll = q1.Concat(q1).Concat(q2).Concat(q3).Concat(q4); 會很有趣,看看它是否按預期工作。您可以爲每個查詢添加一個額外的排序列,以便儘可能訂購某些內容。 –

+0

@SilasHansen謝謝,我會嘗試一下,看看它是如何工作的 – Toodleey

+0

@SilasHansen似乎工作正常,將所有這些連接在一起,並對結果做出了明確的表述。由於事實證明查詢會在稍後重新排序,因此不確定該順序。 – Toodleey

回答

0

您應該使用排名回答西拉斯漢森。例如

var result = query.Select(u => 
{ 
    if (u.Id == valueAsInt || u.ExternalId == valueAsInt) 
     return new {Rank = 1, Item = u}; 
    if (u.Name.Contains(value) || u.UserName.Contains(value)) 
     return new {Rank = 2, Item = u}; 
    //Add the other conditions in here 
    return new {Rank = 3, Item = u}; 
}).OrderBy(u => u.Rank).Select(u => u.Item);