2010-07-09 54 views
1

以前:在this question有人告訴我如何使用CompareTo返回按照字母順序使用LINQ to Objects命令的特定範圍內的姓氏。返回從Linq到Top對象的Top X結果按順序查詢

我的問題的其餘部分,似乎已經錯過了最初的問題,要求喂狂熱,實際上是在我測試這個解決方案後出現的。在前面的eaxample我有名字的列表:

 
Adams 
Bentham 
Bickford 
Gillies 
Kelly 
Moore 
Peters 
Rutherford 
Smith 
Taylor 
Williams 

,我想能夠查詢他們對所有吉利斯和摩爾的名字,例如並獲得:

 
Gillies 
Kelly 
Moore 

這是所有好,如果你想讓每一個單獨的名字在球門柱之間回來,那麼無論如何。例如,如果您有大量姓氏,並且您希望Gillies和Taylor之間的名稱最多有四個按字母順序返回,則問題出現。

因此所需的輸出是:

 
Gillies 
Kelly 
Moore 
Peters 

不過只是返回吉利斯和泰勒之間的四個結果可能返回凱利,彼得斯,史密斯和泰勒,或吉利斯,摩爾,盧瑟福和史密斯。基本上,查詢會引導您根據自己的意思選擇球門柱之間的任何舊四。

那麼,我怎樣才能得到前4名的結果按字母順序。我可以寫第二個查詢當然返回一個子集,然後從中選擇...但不應該有一種方法將此行爲集成到初始查詢中?

我已經用OrderBy嘗試了幾件事情,到目前爲止他們只是不工作。所以這一切都結束了你們。

編輯:對於那些建議使用「take」的人,我已經在使用take。即使您使用OrderBy或至少它不在我的查詢中,它也不會按順序「接受」。這是:

var allIDs = (from cust in dc.orders 
       join item in dc.order_items on cust.orderid equals item.orderid 
       join del in dc.deliveries on cust.deliveryid equals del.deliveryid 
       join dt in dc.deliverytypes on del.deliverytype equals dt.deliverytypeid 
       where eventcode == item.itemcode 
       && dt.description == "Secure Post" 
       && (cust.status == "OK" || cust.status == "PB") 
       && cust.surname.CompareTo(surfrom ?? " ") >= 0 
       && cust.surname.CompareTo(surto ?? "zzz") <= 0 
       && (cust.trackingcode == null ? false : (bool)cust.trackingcode)==false 
       orderby cust.surname, cust.initials, cust.ordercode 
       select cust.orderid).Distinct().Take(ordermax); 

這只是返回四個名稱之間的名稱,而不是特定的四個名稱。

回答

5

從您的編輯,它看​​起來像你這樣做在一個陌生的順序排序依據和獨特的:

該作品對我來說(其中「allMyNames」只是一個列表<字符串>)。

var ofInterest = allMyNames 
        .Distinct() 
        .Where(x => x.CompareTo(from) >= 0 && x.CompareTo(to) <= 0) 
        .OrderBy(x => x) 
        .Take(4); 

我更快樂使用LINQ :)

+0

最終的延伸形式,我投降了,並寫了一個複雜的LINQ語句來選擇這種格式列表中,英文縮寫和姓氏,然後第二個查詢執行採取要求。仍然會很高興從一個查詢返回id列表*聳聳肩* – bert 2010-07-12 10:55:13

2
GetNames(...).Take(4); 

將採取可枚舉的前四項。

4

使用「以」 LINQ法取前4個記錄:

var query = (from name in originalList 
    where name.CompareTo(fromName) >= 0 && name.CompareTo(toName) <= 0 
    orderby name 
    select name).Take(4);