如何在EntityFramework Query中使用标量值函数

时间:2018-03-24 00:05:23

标签: entity-framework-6 sql-server-2014 c#-6.0

我有一个标量值函数如下:

CREATE FUNCTION [dbo].[GetCustomersTime]
(
    @TimeSpanType char(1),
    @TimeSpan int,
    @CurrentUtc datetime
)
RETURNS datetime
AS
BEGIN
    DECLARE @CustomersTime DATETIME; 

    SELECT @CustomersTime = CASE UPPER(@TimeSpanType)
       WHEN 'S' THEN DATEADD(Second, @TimeSpan, @CurrentUtc)
       WHEN 'I' THEN DATEADD(Minute, @TimeSpan, @CurrentUtc)
       WHEN 'H' THEN DATEADD(Hour, @TimeSpan, @CurrentUtc)
       WHEN 'D' THEN DATEADD(Day, @TimeSpan, @CurrentUtc)
       WHEN 'W' THEN DATEADD(Week, @TimeSpan, @CurrentUtc)
       WHEN 'M' THEN DATEADD(Month, @TimeSpan, @CurrentUtc)
       WHEN 'Q' THEN DATEADD(Quarter, @TimeSpan, @CurrentUtc)
       WHEN 'Y' THEN DATEADD(Year, @TimeSpan, @CurrentUtc)
       ELSE DATEADD(SECOND, @TimeSpan, @CurrentUtc)
    END;

    RETURN @CustomersTime
END

我想在Entity Framework Query中使用此函数。我想要实现的查询如下:

SELECT c.CustomerId, c.FirstName, c.LastName, c.OrderDateUtc
FROM dbo.Customer c
--Other INNER JOINs
WHERE dbo.GetCustomersTime(c.[TimeSpanType], c.[TimeSpan], c.OrderDateUtc) > GetUtcDate()
--Additional Conditions

我的实体框架查询是:

(from c in _context.Customers
                 //additional joins
             where //how to use function
             select new
             {
                 c.CustomerId,
                 c.FirstName,
                 c.LastName,
                 c.OrderDateUtc
             }).ToList();

有人建议使用项目并在EF查询中使用GetCustomersTime函数。但我找不到一个真实的例子。任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

尝试以下方法:

  1. 在.edmx文件的(SSDL)中声明一个函数。的名字 function必须与在中声明的函数的名称相同 数据库中。
  2. 将相应的方法添加到应用程序代码中的类中 将EdmFunctionAttribute应用于该方法。
  3. 在LINQ to Entities查询中调用该方法。
  4. 有关详细信息,请查看此link

答案 1 :(得分:0)

看起来我应该更好地搜索它。我发现解决方案建议here。 github链接是CodeFirstFunctions