采取以下措施:
public class ClassA
{
public int ID { get; set; }
public ICollection<ClassB> ClassBs { get; set; }
public bool ChangeMe { get; set; }
}
public class ClassB
{
public int ID { get; set; }
public string test { get; set; }
public bool bar { get; set; }
public ClassA ClassA { get; set; }
public int ClassAID { get; set; }
}
我已加载了ClassB对象,并且我想运行一些执行一些操作的代码,然后将bar更改为true。
完成此操作后,如果Class A的ClassBs集合中的每个ClassB都为true,我想将ClassA的ChangeMe更改为true。
因此,如果我将单个ClassB加载到名为bla
的对象中,则可以尝试以下操作:
if (bla.ClassA.ClassBs.Where(x => x.bar == false).Count() == 0)
{
Do Something
}
但是,尽管有很多应该加载的ClassB对象,但根据本地人的说法,我唯一的对象是当前对象,它似乎意外地制定了Do Something
。
我尝试了以下方法:
_context.Entry(bla).Reference(x => x.ClassA).Load()
_context.Entry(bla).Collection(x => x.ClassA.ClassBs).Load()
_context.Entry(bla.ClassA).Collection(x => x.ClassBs).Load()
还有更多,但是,我似乎得到了各种不同的例外。
简单地加载另一个对象并以正常方式调用.Include()
的简短方式,是否有实现我想要做的事情的地方?
答案 0 :(得分:2)
您可以(1)使用Query方法(可用于参考和集合导航属性),并且(2)可以将它与热切的加载方法(Include
/ ThenInclude
)结合使用,例如
_context.Entry(bla).Reference(x => x.ClassA)
.Query() // <-- (1)
.Include(x => x.ClassBs) // <-- (2)
.Load();
答案 1 :(得分:0)
首先,我认为您应该将导航属性标记为virtual
public class ClassA
{
public int ID { get; set; }
public virtual ICollection<ClassB> ClassBs { get; set; }
public bool ChangeMe { get; set; }
}
public class ClassB
{
public int ID { get; set; }
public string test { get; set; }
public bool bar { get; set; }
public virtual ClassA ClassA { get; set; }
public int ClassAID { get; set; }
}
,然后使用Include
和ThenInclude
的链条
var bla = _context.Set<ClassB>().Include(cb=>cb.ClassA).ThenInclude(ca=>ca.ClassBs).ThenInclude(cb=>cb.ClassA).Where(x=>x.Id=blaId)
if (bla.ClassA.ClassBs.Where(x => x.bar == false).Count() == 0)
{
Do Something
}