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

Gri*_*imm 11 c# sql-server entity-framework entity-framework-core asp.net-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; }
}
Run Code Online (Sandbox Code Playgroud)

在我的上下文类中,我为我希望使用的标量函数的每个返回类型注册这些类型 - 因此对于返回'int'的所有标量函数,上下文类将有一个额外的条目,如下所示:

public virtual DbQuery<PrimitiveDto<int>> BasicIntDto { get; set; }
Run Code Online (Sandbox Code Playgroud)

在应用程序的每个部分,我想调用一个返回'int'的标量函数,我只使用相同的以下模式:

context.BasicIntDto.FromSql("SELECT <FUNCTION> AS Value")
Run Code Online (Sandbox Code Playgroud)

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

如果我能通过这种模式遇到陷阱,请告诉我.非常感谢你.

sof*_*ntp 1

不幸的是,这个功能似乎已被搁置: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();
       }
    }
 }
Run Code Online (Sandbox Code Playgroud)

然后你可以打电话DbFunctions.MyFunctionABC(x,y);