本節講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是對記憶體進行操...