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

我经常需要从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")

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

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

参考方案

不幸的是,此功能似乎已被搁置: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);

Entity Framework DbEntityEntry>'不包含Where的定义 - c#

此代码狙击手来自Adding CreatedDate to an entity using Entity Framework 5 Code First public override int SaveChanges() { DateTime saveTime = DateTime.Now; foreach (var entry in this.ChangeT…

如何以编程方式将ListView滚动到最后一个元素-Compact Framework - c#

我正在使用Windows Mobile 6.1上的3.5 Compact Framework开发应用程序。我有一个ListView,添加项目时想自动滚动此列表。我能怎么做? 参考方案 listView.EnsureVisible(listView.Items.Count - 1);

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

模块化C#Compact Framework 2.0应用程序 - c#

我们目前正在开发新的手持软件。我无法讨论应用程序的性质,因此我将使用一个示例。我们正在设计用于管理学校的手持软件。我们希望对系统的各个方面进行模块化,以便不同的学校可以使用不同的功能。我们的系统将从主菜单和登录屏幕开始。我希望这可以作为系统的基础,并成为要添加模块的位置。即我将有一个名为SchoolPda的项目。然后,我想拥有不同的模块。即,我想要一个注册模…

Compact Framework-如何在没有默认构造函数的情况下动态创建类型? - c#

我正在使用.NET CF 3.5。我要创建的类型没有默认的构造函数,因此我想将字符串传递给重载的构造函数。我该怎么做呢?码:Assembly a = Assembly.LoadFrom("my.dll"); Type t = a.GetType("type info here"); // All ok so far, …