2013-04-14 12 views
6

在我的數據庫中,我定義了一些函數,假設它叫做fnTest。 是否可以從我的LINQ/EF查詢中調用該函數?事情是這樣的:如何從EF LINQ查詢調用DB函數?

var param3, param4; 
var res = (from x in db.Something 
      where x.field1 > 0 
      orderby fnTest(x.f1, x.f2, param3, param4) 
      select x).Take(20); 

正如你所看到的,我需要的函數,在數據庫端執行,因爲我需要使用的值,它返回的數據進行排序。前兩個參數是表中的字段,後兩個參數是一些在程序中會改變的數字,但對於每個查詢都是不變的。

是否有可能以某種方式調用已經在數據庫中創建的函數?或者我需要使用這樣的東西:

((IObjectContextAdapter) context).ObjectContext.CreateQuery 

並寫入查詢手動?

回答

6

首先,fnTest將在數據庫中的第一個用戶定義的函數創建:

CREATE FUNCTION [fnTest] (@fi int, @f2 int, @param3 int, @param4 int) 
RETURNS int 
AS ... 

然後在您的.edmx文件,聲明函數像這樣:

<Function Name="fnTest" ReturnType="int" Schema="dbo" > 
    <Parameter Name="f1" Mode="In" Type="int" /> 
    <Parameter Name="f2" Mode="In" Type="int" /> 
    <Parameter Name="param3" Mode="In" Type="int" /> 
    <Parameter Name="param4" Mode="In" Type="int" /> 
</Function> 

現在你可以此功能的方法在模型綁定是這樣的:

[EdmFunction("MyNamespace", "fnTest")] 
public static int fnTest(int f1, int f2, int param3, int param4) 
{ 
    throw new NotSupportedException("Direct calls are not supported."); 
} 

您現在可以在標準LINQ查詢中使用此方法。

進一步閱讀

+0

謝謝,這正是我想要的! – xx77aBs