將(jiang)不(bu)確定變為確定~Linq to SQL不(bu)能隨機排序嗎?
一般來(lai)說(shuo),在T-SQL時(shi)代(dai),隨機排序可以進行newid()產(chan)生出guid值來(lai)實(shi)現(xian),代(dai)碼(ma)一般為:
SELECT TOP 10 * FROM User ORDER BY NEWID();而到了(le)linq to sql時代,由于產生的語(yu)句(ju)為延時的(可能是(shi)這(zhe)個(ge)原(yuan)因(yin)),所以你用類似這(zhe)代碼:
from user in db.User order by Guid.NewID() select user
是不能實(shi)現(xian)的(de)(de)(de),這時,如果你的(de)(de)(de)linq to sql非要(yao)找個實(shi)現(xian)的(de)(de)(de)方(fang)法,可以在當前數據(ju)上(shang)下文(wen)類中,加個函數:(注意(yi),我們(men)為了擴(kuo)展性,最要(yao)新建一個分
部來做這事)
1 /// <summary> 2 /// 數(shu)據(ju)上(shang)下文擴展 3 /// </summary> 4 public partial class dbDataContext 5 { 6 /// <summary> 7 /// 隨機排序 8 /// </summary> 9 /// <returns></returns> 10 [Function(Name = "NewID", IsComposable = true)] 11 public Guid NewID() 12 { 13 return ((Guid)(this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())))
.ReturnValue)); 14 15 } 16 }
具體擴展代碼:
from user in db.User order by db.NewID() select user
如(ru)(ru)果(guo)希望(wang)按(an)著某個(ge)字(zi)符串中字(zi)符出現的次序,進行特定(ding)的排序,可以(yi)使用IndexOf,代碼如(ru)(ru)下:
1 List<string> productids={"1","2","3"}; 2 linq.ToList().OrderByDescending(a => productids 3 .IndexOf(a.MC_ProductID)) 4 .ToList();
有時(shi)(shi),我們要(yao)為(wei)多個(ge)字段進行主(zhu)要(yao),次要(yao)的排序,這時(shi)(shi),可以用linq自(zi)帶的ThenBy,比較簡單,就不舉例(li)子(zi)了。