使用Entity Framework Core(2.1)调用标量函数的最佳实践

时间:2018-07-03 10:03:22

标签: c# sql-server entity-framework asp.net-core entity-framework-core

我经常需要从我的Web应用程序(ASP.NET Core / EF Core)中调用在SQL Server上定义的标量函数。由于这些函数只是简单的帮助程序函数,并且我也使用了许多辅助函数,因此我使用了通用模式来调用这些标量函数-借助EF Core 2.1提供的新查询类型。 由于我是EF Core的新手,所以我的问题是这种模式是否会引起问题和/或是否有更好的解决方案或最佳实践来调用标量函数。该解决方案有效,到目前为止我还没有观察到任何问题,但是例如,我想知道是否由于EF Core中的缓存/跟踪行为等原因,对不同的函数使用相同的查询类型是否会导致意外的值或奇怪的行为-这更多的是直觉。

所以这是模式: 不必为每个单个标量函数定义不同的实体类型,而是仅定义一个通用类型:

public class PrimitiveDto<T>
{
    public T Value { get; set; }
}

在我的上下文类中,我为我要使用的标量函数期望的每种返回类型注册了这些类型-因此,对于所有返回“ int”的标量函数,上下文类将具有这样的一个附加条目:

public virtual DbQuery<PrimitiveDto<int>> BasicIntDto { get; set; }

在应用程序的每个要调用返回“ int”的标量函数的部分中,我都使用相同的以下模式:

context.BasicIntDto.FromSql("SELECT <FUNCTION> AS Value")

通过使用这种模式,我可以以相同的方式调用任意数量的函数,而无需定义其他类型或扩展上下文类。

请让我知道是否可以通过此模式遇到陷阱。非常感谢。

1 个答案:

答案 0 :(得分:0)

不幸的是,该功能似乎已被搁置:https://github.com/aspnet/EntityFrameworkCore/issues/9810

一种选择是使用一个永远不会为空的小表将函数调用包装在静态类中:

public static class DbFunctions
{
   public static decimal MyFunctionABC(int param1, int param2)
   {
       using (var db = new MyDbContext())
       {
        return db.table.Take(1).Select(t => MyDbContext.MyFunctionABC(x, y)).Single();
       }
    }
 }

然后您可以致电DbFunctions.MyFunctionABC(x,y);