C 3 0入門系列(六) 之OrderBy操作

2021-09-09 04:35:15 字數 3730 閱讀 5167

本節講orderby操作.我突然在想這麼乙個問題,讀者會t-sql嗎?要是不知道,那我寫的是不是太簡單了呢?做個調查哦,不知道的舉手.

orderby操作

簡單的,按雇用日期排序,預設為公升序

var q 

=from e 

indb.employees

orderby e.hiredate

select e;

帶where條件的,shipcity為london的。

var q 

=from o 

indb.orders

where o.shipcity =="

london

"orderby o.freight

select o;

或var q 

=from o 

indb.orders

orderby o.freight

where o.shipcity =="

london

"select o;

在這裡where和orderby的順序並不重要。而在t-sql中,where和orderby有嚴格的位置限制。

orderbydescending的,按**降序。

var q 

=from p 

indb.products

orderby p.unitprice descending

select p;

thenby的和thenbydescending,也就是按多個列進行排序,第乙個列子是先按city,city相同的再按contactname排序,第二個例子中,第二序列為降序。

thenby:

var q 

=from c 

indb.customers

orderby c.city, c.contactname

select c;

thenbydescending:

var q 

=from o 

indb.orders

where o.employeeid ==1

orderby o.shipcountry, o.freight descending

select o;

對這兩個句子解釋下。

對於thenby操作,其級連形式為:

var q 

=db.customers.orderby(c 

=>

c.city).thenby(c 

=>

c.contactname).tolist();

因為t-

sql中,並沒有thenby語句,其依然翻譯為orderby

所以,也可以用下面語句來表達

var q 

=db.customers.orderby(c 

=>

c.contactname).orderby(c 

=>

c.city).tolist();

所要注意的是,是兩個orderby的順序,多個orderby操作時,級連方式是按逆序.即先按city排時,city要放在最後。

對於降序的,用相應的降序操作符替換即刻。

var q 

=db.customers.orderbydescending(c 

=>

c.city).thenbydescending(c 

=>

c.contactname).tolist();

需要說明的是,orderby操作,不支援按type排序,也不支援匿名類。

比如  var q = db.customers.orderby(c => c).tolist();和

var q = db.customers.orderby(c => new ).tolist();

會被丟擲異常。但是,既然提了,大家在這個問題就不會犯錯誤,常見的錯誤是前面的操作有匿名類,再跟orderby時,比較的是類別。比如

var q = db.customers.select(c => new ).orderby(c => c).tolist();

如果你想使用orderby(c => c),其前提條件是,前面步驟中,所產生的物件的類別必須為c#語言的基本型別。比如

var q = db.customers.select(c=>c.city).orderby(c => c).tolist();

city為string型別。

還有一點需要說明的時,linq和dlinq在orderby操作中,稍微有一點區別。linq支援按type排序,但是,需要你自己去實現icomparable介面。

比如語句:var q = db.customers.tolist().orderby(c => c).tolist();

第乙個tolist()會把資料庫中所有資料取出,放到記憶體中,以後所有的操作全部是對記憶體操作。後面的所有操作均為linq操作,不是dlinq。(這一點,我前面的文章中講過)如果,你想用按客戶進行排序,你必須在customer類中,實現icomparable介面

其customer類,必須從icomparable繼承,**如下,

public partial class customers : system.data.linq.inotifypropertychanging, system.componentmodel.inotifypropertychanged,icomparable

icomparable介面的具體實現如下:

#region

icomparable members

public

intcompareto(

object

obj)

#endregion

orderby操作,會自動呼叫該介面的方法,實現按類別排序。如果,你的對映檔案中沒有實現該介面,系統會丟擲異常。

你也可以使用generic,如下,

public partial class customers : system.data.linq.inotifypropertychanging, system.componentmodel.inotifypropertychanged,icomparable

#region

icomparablemembers

public

intcompareto(customers other)

#endregion

好處就是你無須把object強制轉化為customer類。

我們再來定義個,先按訂單號排序,相同訂單按產品號排序的。

public partial class orderdetails : system.data.linq.inotifypropertychanging, system.componentmodel.inotifypropertychanged,icomparable

#region

icomparablemembers

public

intcompareto(orderdetails other)

return

k;//

throw new exception("the method or operation is not implemented.");}

C 3 0 入門系列(一)

談到dlinq,就不得不先說linq。讓我們先看看什麼是linq。linq是 language integrated query的縮寫。那麼事實上dlinq就是 database language integrated query 的縮寫。linq和dlinq最大的區別就在與linq是對記憶體進行操...

C 3 0入門系列(二)

c 3.0入門系列 二 在第一篇中,我已經和大家簡單介紹了linq。也和大家提起linq是c 3.0裡的乙個特性。不過,你去裝linq priview時,你會發現,它提供了許多vb的linq 從現在的情況看,linq會被移植到.net framework下。在本篇中,筆者將開始更加詳細的介紹dlin...

C 3 0 入門系列(一)

談到dlinq,就不得不先說linq。讓我們先看看什麼是linq。linq是 language integrated query的縮寫。那麼事實上dlinq就是 database language integrated query 的縮寫。linq和dlinq最大的區別就在與linq是對記憶體進行操...