我们的数据库中有标量功能,用于返回“客户的任务数量”或“客户的总发票金额”等内容。
我们正在尝试并尝试使用存储过程来执行此操作...通常我们只需在存储过程中调用此函数并将其作为单个值返回。
有没有办法使用LINQ to SQL来使用或访问标量函数?如果是这样,我会有兴趣看一个如何...的例子,如果没有,如何处理这种情况最好......如果它甚至是可行的。
答案 0 :(得分:9)
LINQ-to-SQL支持与UDF一起使用,如果这是你的意思。只需将UDF拖到设计器表面上即可完成。这会在数据上下文上创建一个匹配方法,标记为[Function(..., IsComposable=true)]
或类似,告诉LINQ-to-SQL它可以在查询中使用它(注意EF不支持这种用法)。
然后,您可以在查询中使用它,如:
var qry = from cust in ctx.Custs
select new {Id = cust.Id, Value = ctx.GetTotalValue(cust.Id)};
这将成为TSQL:
SELECT t1.Id, dbo.MyUdf(t1.Id)
FROM CUSTOMER t1
(或者那里)。
它是可组合的这一事实意味着您可以在查询中使用该值 - 例如在Where()
/ WHERE
中 - 从而减少从服务器返回的数据(尽管显然是UDF)仍然需要以某种方式执行。)
Here's a similar example,显示在数据上下文中使用的伪UDF,说明该方法的C#版本未使用。
实际上,我目前正在研究这样的UDF以可组合的方式提供“模型外”数据 - 即系统的某个特定部分需要访问某些数据(恰好位于同一个数据库中)它确实是同一个模型的一部分,但我想以有趣的方式JOIN
。我也有用于此目的的现有SP ...所以我正在考虑将这些SP移植到表格UDF,它提供围绕模型外数据的合同/抽象级别。因为它不是我的模型的一部分,我只能通过UDF获得它 - 但我保留了用我的常规模型组合它的能力。
答案 1 :(得分:1)
我相信this MSDN documentation就是你所追求的(作为this wider topic of calling user-defined functions in LINQ to SQL的一部分)。不能说我自己做过,但听起来不错......