擴充套件linq to entities查詢的簡便方法就是使用函式。有四種型別的函式可以應用:
規範函式—linq to entities本身沒有提供的一組預定義的函式。在這部分,只涉及到規範函式和資料庫函式,另外兩個函式值得作出更多的解釋和需要ef更深的知識,我們在11章再討論。資料庫函式—一組預定義的sql server函式。
模型中定義的函式—儲存在edm中的使用者定義的實體sql函式。
自定義資料庫函式—可以在查詢中使用的使用者定義的資料庫函式。
規範函式是執行資料庫操作的有效方法。例如,有執行數**算,日期比較的函式等等。在ef1.0,規範函式只能在entity sql查詢中執行,但是現在已經使用clr方法進行了封裝,如此一來就可以被linq to entities呼叫。這一變化通過重用現有的功能擴充套件了linq to entities的功能。
我們來看乙個例子。我們的客戶想要乙個超過5天發貨的訂單列表。使用linq查詢相當簡單:
var result = from o in ctx.orders查詢編譯通過,但是在執行時會得到乙個異常,因為翻譯引擎不能將adddays方法轉換成合適sql。where o.orderdate.adddays(5) < o.actualshippingdate
select o;
規範函式使用diffdays方法填補這個漏洞,該方法接受兩個日期作為引數,返回它們之間的天數。這個方法以及其他規範函式的的部分可以在system.data.objects命名空間下的entityfunctions類中找到。
var result = from o in ctx.orders另乙個例子使用數學函式。四捨五入、上取整、下取整、數的n次方,所有的操作都可以使用system.math類中的方法執行。但是,正如datetime方法,sql翻譯引擎不支援math中的方法。你可以使用entityfunctions類中的pow,round,ceiling和floor作為替代方法。where
entityfunctions.diffdays(o.orderdate, o.actualshippingdate) > 5
select o;
這些函式可以在查詢中任何位置呼叫而不僅僅限於where子句。例如,你可以在select子句中使用abs函式取得乙個數的絕對值。
規範函式是實體sql與資料庫無關的函式。但是在很多情況下,將你的**指定到特定的資料庫也不是問題,因為你知道你不會改變使用的資料庫。如果是這種情況,你可以呼叫特定資料庫的函式更好的使用這個平台。
每個資料庫都有自己的函式集。有一些函式在不同的rdbms中是相通的,像abs,ltrim,rtrim,它們都可以通過linq to entities或者實體函式呼叫。其他函式在每個資料庫中都是特有的或者說有不同的特徵。
幸運的是你同樣也可以呼叫這些函式。ef在system.data.objects.sqlclient命名空間下的sqlfunctions類下有很多指定到sql server的函式。checksum,charindex,cos,getdate和rand都是這些有用函式的例子。
除了規範函式和資料庫函式屬於不同的類,它們兩個沒有其他的區別。它們都是作為靜態方法被呼叫以及可以在查詢的任何位置被呼叫。下面的**使用資料庫函式展現超過5天發貨的訂單。
var result = from o in ctx.orders通過使用資料庫函式,你配合你的**到乙個特定的資料庫(本例子中是sql server)。這並不總是乙個好主意,因為如果你更改資料庫,就必須改變你的**。但是如果你知道你不會改變你的應用程式使用的資料庫,你可以使用資料庫函式,沒有任何問題。請務必慎重考慮是否應該使用這些函式。where
sqlfunctions.datediff("d", o.orderdate, o.actualshippingdate) > 5
select o;
使用特定於資料庫的函式是配合你的資料庫到乙個資料庫平台的兩種方法之一。另一種選擇是在**中嵌入sql查詢。即使sql是一種標準的語言,但查詢往往依賴於特定資料庫的特徵,所以你最終都要將你的**指定到特定的資料庫。
使用Entity開發遇到的小問題
1 異常 entitycommandexecutionexception 儲存區資料提供程式返回的資料讀取器所具有的列數對於所請求的查詢不夠。這個異常是因為儲存過程匯入函式呼叫的異常。過程的 alter procedure dbo eware get identity id table name n...
5 1 2 對映實體 Entity
標註 entity 注釋的類,表示該類是乙個可持久化的實體。當在容器中時,伺服器將會首先載入所有標註了 entity 注釋的實體類。例如,contact 類標註成實體後,如以下所示。entity public class contacteo entity 注釋的定義的屬性如下。target type...
android post提交的entity問題
1。提交的是一些json的string 2。提交的是一些key value 3。提交一些有點大的,聲音檔案,將其轉換成byte 4。其它一些自定義的資料 比如 post提交一些檔案,也想用httppost這個類通一進行提交 1.先將模擬post上傳檔案的一些格式上的東西,檔案等寫到乙個bytearr...