我们的数据库中具有标量函数,用于返回诸如“客户的任务数量”或“客户的发票总额”之类的内容。
我们正在尝试并尝试不使用存储过程来执行此操作…通常,我们只需要在存储过程中调用此函数并将其作为单个值返回即可。
有没有一种方法可以在LINQ to SQL中使用或访问标量函数?如果是这样,那么我将有兴趣看到一个示例,该示例如何…如果没有,那么如何最好地处理这种情况…甚至是可行的。
如果这就是您的意思,LINQ-to- SQL支持与UDF一起使用。只需将UDF拖到设计器图面上即可。这会在数据上下文上创建一个标记[Function(..., IsComposable=true)]或类似的匹配方法,告诉LINQ-to- SQL它可以在查询中使用此方法(请注意EF不支持此用法)。
[Function(..., IsComposable=true)]
然后,您可以在查询中使用它,例如:
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)。
Where()
WHERE
这是一个类似的示例,显示了在数据上下文中使用的伪UDF,说明未使用该方法的C#版本。
实际上,我目前正在研究这样的UDF,以可组合的方式提供“模型外”数据- 即系统的特定部分需要访问一些不是真的数据(恰好在同一个数据库中)相同模型的一部分,但我想以JOIN有趣的方式。我也有用于此目的的现有SP …因此,我正在考虑将这些SP移植到表格式UDF,这为围绕模型外数据提供了一定程度的合同/抽象性。因此,由于它不是模型的一部分,因此只能通过UDF进行获取- 但我仍然可以将其与常规模型组合在一起。
JOIN