在edmx创建和用户用户定义函数
答
你有一个问题是你的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 )
存储过程执行方法。
我在ssdl中添加了标记,其中在部分中定义了我的sql查询并将其设置为iscomposable = true,但它不起作用,我只是想根据产品ID从我的表中获取产品名称, –
2012-03-28 07:28:09