我经常需要从我的Web应用程序(ASP.NET Core / EF Core)调用在SQL Server上定义的标量函数。由于这些函数只是简单的辅助函数,我也使用了很多,因此我使用通用模式来调用这些标量函数 - 借助EF Core 2.1提供的新查询类型。
由于我对EF Core相对较新,所以我的问题是,这种模式是否会导致问题和/或是否有更好的解决方案或最佳实践来调用标量函数。该解决方案有效,到目前为止我还没有发现任何问题,但例如,我想知道是否使用相同的查询类型来调用不同的函数可能会导致意外值或由于EF Core中的缓存/跟踪行为等而导致奇怪的行为 - 这更像是一种直觉感觉。
因此,这里是模式: 我不是为每个单独的标量函数定义不同的实体类型,而是定义一个通用类型:
在我的上下文类中,我为每个我想要使用的标量函数返回类型注册这些类型 - 因此,对于所有返回“int”的标量函数,上下文类将有一个额外的条目,如下所示:
通过使用这种模式,我可以以相同的方式调用任意数量的函数,而无需定义其他类型或扩展上下文类。
请告诉我是否会通过这种模式陷入陷阱。非常感谢。
因此,这里是模式: 我不是为每个单独的标量函数定义不同的实体类型,而是定义一个通用类型:
public class PrimitiveDto<T>
{
public T Value { get; set; }
}
在我的上下文类中,我为每个我想要使用的标量函数返回类型注册这些类型 - 因此,对于所有返回“int”的标量函数,上下文类将有一个额外的条目,如下所示:
public virtual DbQuery<PrimitiveDto<int>> BasicIntDto { get; set; }
对于 EF Core >= 3 版本,它是:
public virtual DbSet<PrimitiveDto<int>> BasicIntDto { get; set; }
在应用程序的每个需要调用返回'int'的标量函数的部分,我都只是使用以下相同的模式:
context.BasicIntDto.FromSql("SELECT <FUNCTION> AS Value")
通过使用这种模式,我可以以相同的方式调用任意数量的函数,而无需定义其他类型或扩展上下文类。
请告诉我是否会通过这种模式陷入陷阱。非常感谢。
BasicDto<int>
,接受所需的任何参数。 - Bradley UffnerEnumerable.Single
方法。 - Mark GDbSet<PrimitiveDto<int>>
。 - Endy Tjahjono