小编典典

是否可以在LINQ to SQL中使用/访问标量函数?

sql

我们的数据库中具有标量函数,用于返回诸如“客户的任务数量”或“客户的发票总额”之类的内容。

我们正在尝试并尝试不使用存储过程来执行此操作…通常,我们只需要在存储过程中调用此函数并将其作为单个值返回即可。

有没有一种方法可以在LINQ to
SQL中使用或访问标量函数?如果是这样,那么我将有兴趣看到一个示例,该示例如何…如果没有,那么如何最好地处理这种情况…甚至是可行的。


阅读 153

收藏
2021-03-23

共1个答案

小编典典

如果这就是您的意思,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)。

这是一个类似的示例,显示了在数据上下文中使用的伪UDF,说明未使用该方法的C#版本。

实际上,我目前正在研究这样的UDF,以可组合的方式提供“模型外”数据-
即系统的特定部分需要访问一些不是真的数据(恰好在同一个数据库中)相同模型的一部分,但我想以JOIN有趣的方式。我也有用于此目的的现有SP
…因此,我正在考虑将这些SP移植到表格式UDF,这为围绕模型外数据提供了一定程度的合同/抽象性。因此,由于它不是模型的一部分,因此只能通过UDF进行获取-
但我仍然可以将其与常规模型组合在一起。

2021-03-23