gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:25:39 31 4
gpt4 key购买 nike

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

[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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com