2012-03-28 64 views
0

我想在edmx中創建一個函數返回定標器值, 如何在SSDL中創建它,以及如何在代碼中訪問它?在edmx創建和用戶用戶定義函數

+0

我在ssdl中添加了標記,其中在部分中定義了我的sql查詢並將其設置爲iscomposable = true,但它不起作用,我只是想根據產品ID從我的表中獲取產品名稱, – 2012-03-28 07:28:09

回答

0

你有一個問題是你的SSDL是由'EntityModelGenerator'自動生成的,所以編輯它將被重建消滅。您的編輯需要在EDMX文件中完成。所以首先,你必須決定(1)你的返回值是什麼類型的計算(即在應用程序中而不是在數據庫級別上一起增加值),還是(2)它是直接調用數據庫存儲過程?

(1)第一步是將功能XML定義添加到您的EDMX文件:

<Function Name="LineTotal" ReturnType="decimal"> 
    <Parameter Name="lineTotal" Type="MyDbModel.OrderDetail"> 
    <DefiningExpression> 
     od.Price * od.Quantity 
    </DefiningExpression> 
    </Parameter> 
</Function> 

現在,雖然你的EDMX知道這個功能,你的智能感知不會。所以你必須添加一些代碼來完成這項工作。將這些功能放置在單獨的課堂中是最佳做法。

public class ModelDefinedFunctions 
{ 
    [EdmFunction("MyDbModel" , "LineTotal")] //Model Name and Function Name 
    public static decimal LineTotal(OrderDetail od) 
    { 
     throw new NotSupportedException("LineTotal cannot be directly used."); 
    } 
} 

Entity Framework將知道將此函數調用重定向到EDMX。對模型不存在的此方法的任何直接調用都會引發異常。

你可以再調用它在你的LINQ查詢像

var productValues = from line in model.OrderDetails 
        select new 
        { 
         od.ProductID, 
         od.Price, 
         od.Quantity, 
         LineTotal = ModeDefinedFunctions.LineTotal(line) 
        }; 

(2)如果您是直接將存儲的過程中,更容易將它拖放到EDMX設計師。有一個[FunctionImport()]屬性,但我沒有使用它。您可以拖放並查看它在EDMX文件中生成的代碼?

或者,您可以調用model.ExecuteCommand(<spname> , params object[] values )存儲過程執行方法。

相關問題