![](/img/trans.png)
[英]What's the correct way to reference tables using Code First with EF.Core for searching efficiently
[英]What is the correct way to load a collection of a reference of an object in EF Core?
采取以下措施:
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()
簡單地加載另一個對象並以正常方式調用.Include()
,還有什么可以實現我想要做的事情嗎?
您可以(1)使用Query方法(可用於參考和集合導航屬性),並且(2)將它與熱切的加載方法( Include
/ ThenInclude
)結合使用,例如
_context.Entry(bla).Reference(x => x.ClassA)
.Query() // <-- (1)
.Include(x => x.ClassBs) // <-- (2)
.Load();
首先,我認為您應該將導航屬性標記為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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.