在edmx创建和用户用户定义函数

问题描述:

我想在edmx中创建一个函数返回定标器值, 如何在SSDL中创建它,以及如何在代码中访问它?在edmx创建和用户用户定义函数

+0

我在ssdl中添加了标记,其中在部分中定义了我的sql查询并将其设置为iscomposable = true,但它不起作用,我只是想根据产品ID从我的表中获取产品名称, – 2012-03-28 07:28:09

你有一个问题是你的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 )存储过程执行方法。