c# - Entity Framework Core 2.2 使用标量 DBFunction 获取外键列表中的属性

标签 c# .net-core entity-framework-core user-defined-functions

我有一个带有外键链表的模型,即

[Table("a"]
public class A {
    [Key]
    [Column("a_id")]
    public int Id { get; set; }

    public List<B> Bs { get; set; } = new List<B>();
}

[Table("b"]
public class B {
    [Key]
    [Column("b_id")]
    public int Id { get; set; }
    [NotMapped]
    public string MyFunctionValue { get; set; }

    [ForeignKey("a_id")]
    public A A { get; set; }
}

然后我定义了一个链接到标量 sql 函数的函数,就像这样......

public static class MySqlFunctions {
    [DbFunction("MyFunction", "dbo")]
    public static string MyFunction(int bId) {
        throw new NotImplementedException();
    }
}

并像这样在我的上下文中注册...

modelBuilder.HasDbFunction(() => MySqlFunctions.MyFunction(default));

我希望能够在我的存储库类中做的是在列表中获取带有链接 B 记录的 A 记录,当针对 B 的 ID 运行时,它们的 MyFunctionValue 值设置为函数的返回值。喜欢...

myContext.A
    .Include(a => a.Bs.Select(b => new B {
        Id = b.Id,
        MyFunctionValue = MySqlFunctions.MyFunction(b.Id)
    });

然而,到目前为止,我尝试了所有选项,我得到的是 InvalidOperationException 或 NotImplementedException,我猜是因为它无法正确地将其转换为 SQL?

有什么方法可以编写这样的查询,或者对于 EF 来说生成 SQL 是否太复杂了?我知道我有可能使用 .FromSql,但我宁愿尽可能避免使用它,因为它有点困惑。

编辑:

所以我设法让它与下面的代码一起工作,但它显然有点困惑,如果有人有更好的解决方案,我将不胜感激。

myContext.A
    .Include(a => a.Bs)
    .Select(a => new {
        A = a,
        MyFunctionValues = a.Bs.Select(b => MySqlFunctions.MyFunction(b.Id))
    })
    .AsEnumerable()
    .Select(aWithMfvs => {
        for (int i = 0; i < aWithMfvs.MyFunctionValues.Count(); i++) {
            aWithMfvs.A.Bs[i].MyFunctionValue = aWithMfvs.MyFunctionValues[i];
        }

        return aWithMfvs.A;
    })
    .AsQueryable();

最佳答案

对于数据库函数,您应该考虑几件事情:

  • 当您将 DbFunction 声明为静态方法时,您不必向 modelBuilder 注册它
  • 只有在您使用 Fluent API 时才需要注册(恕我直言,为了让您的实体不受任何依赖,我还是推荐使用它)
  • 返回值、方法名和方法参数的个数、类型和顺序必须与您在用户定义函数(UDF)中的代码相匹配
    • 您将方法参数命名为 bId。它在您的 UDF 中是否完全相同,或者与表中的 b_id 完全相同?

关于c# - Entity Framework Core 2.2 使用标量 DBFunction 获取外键列表中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58084757/

相关文章:

c# - WCF 之外的项目中的 DataContract

c# - 创建搜索框控件

c# - 如何编写ForAllMaps函数

asp.net - 缺少 .NET Framework 模板 Visual Studio 2017

c# - Entity Framework Core DbUpdateException 详细信息

c# - Windows.Forms 助记符不起作用

c# - 在网页中显示来自数据库的图像

visual-studio - 强制将特定的 nuget 包下载到本地包文件夹

c# - 我如何模拟 AddAsync?

c# - 分组和扁平化 1 :M:M:1 related data in Entity Framework Core/LINQ