gpt4 book ai didi

c# - EF Eager 获取派生类

转载 作者:太空狗 更新时间:2023-10-29 20:33:08 25 4
gpt4 key购买 nike

我正在使用 EF6 并尝试急切获取对象的整个结构。问题是我正在使用继承。

假设我有这个类(class)。

数据库上下文

DbSet<A> A { get; set; }

示例类

public class A
{
public string Id { get; set; }
public IList<Base> Bases { get; set; }
}

public abstract class Base
{
public int Id { get; set; }
public string Name { get; set; }
}

public abstract class Base1 : Base
{
public SomeClass SomeClass { get; set; }
}

public class Base2 : Base1
{

}

public class Base3 : Base1
{
public SomeOtherClass SomeOtherClass { get; set; }
}

我得到的错误是:

The Include path expression must refer to a navigation property defined on the type. 
Use dotted paths for reference navigation properties and the Select operator for collection navigation properties.

为什么它不适用于以下内容?

    public IEnumerable<A> GetAll(string id)
{

return _ctx.A
.Include(x => x.Bases.OfType<Base1>().Select(y=>y.SomeClass))
.Where(x => x.Id.Equals(id)).ToList();
}

新例子

public IEnumerable<A> GetAll(string id)
{

var lists = _dbContext.A.Where(x => x.Id == id);
lists.SelectMany(a => a.Bases).OfType<Base1>().Include(e=>e.SomeClass).Load();
lists.SelectMany(b => b.Bases).OfType<Base3>().Include(e => e.SomeOtherClass).Load();

return lists;
}

编辑:添加了一个似乎有效的新示例。

最佳答案

很快,开箱即用是不可能的。

我可以建议的唯一解决方法是具体化主查询结果,然后使用与主查询相同的过滤器使用必要的 Includes 执行多个 OfType 查询,并且依赖于 EF 导航属性修正。

它需要 Base 类中的反向导航属性:

public abstract class Base
{
// ...
public A A { get; set; }
}

然后你可以使用这样的东西:

public IEnumerable<A> GetAll(string id)
{
var a = _ctx.A.Where(x => x.Id == id).ToList();
_ctx.Base.OfType<Base1>().Include(e => e.SomeClass).Where(e => e.A.Id == id).Load();
_ctx.Base.OfType<Base3>().Include(e => e.SomeOtherClass).Where(e => e.A.Id == id).Load();
return a;
}

同样的想法可以在没有反向导航属性的情况下使用,但使用返回的基本 ID 作为过滤器:

public IEnumerable<A> GetAll(string id)
{
var a = _ctx.A.Include(e => e.Bases)
.Where(x => x.Id == id).ToList();

var baseIds = a.SelectMany(e => e.Bases.OfType<ModelA.Base1>().Select(b => b.Id));
db.Base.OfType<Base1>().Include(e => e.SomeClass)
.Where(e => baseIds.Contains(e.Id)).Load();

baseIds = a.SelectMany(e => e.Bases.OfType<Base3>().Select(b => b.Id));
db.Base.OfType<Base3>().Include(e => e.SomeOtherClass)
.Where(e => baseIds.Contains(e.Id)).Load();

return a;
}

关于c# - EF Eager 获取派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39602011/

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