"N + 1选择问题"通常被称为对象关系映射(ORM)讨论中的一个问题,我理解它必须为对象中看起来很简单的事情做出大量的数据库查询.世界.
有没有人对这个问题有更详细的解释?
我在带有TreeNodes表的DB中有一个树结构.该表有nodeId,parentId和parameterId.在EF中,结构类似于TreeNode.Children,其中每个子节点都是TreeNode ...我还有一个包含id,name和rootNodeId的Tree表.
在一天结束时,我想将树加载到TreeView中,但我无法想象如何一次加载它.我试过了:
var trees = from t in context.TreeSet.Include("Root").Include("Root.Children").Include("Root.Children.Parameter")
.Include("Root.Children.Children")
where t.ID == id
select t;
Run Code Online (Sandbox Code Playgroud)
这将使我成为前两代而不是更多.如何使用所有代和其他数据加载整个树?
我的数据库中有一个表,用于存储位置的层次结构。它有 3 列(Id, Name, ParentId)。我需要根据条件加载一些行以及它们的所有父行直到根。如果是在 ADO 中,我会使用以下语句。
with Temp
as
(
select * from Locations where Name like '%filter%'
union all
select Locations.*
from Temp join Locations on Temp.ParentId = Locations.Id
)
select * from Temp
Run Code Online (Sandbox Code Playgroud)
我正在使用 EFCore,并通过一些搜索发现实体框架如何与递归层次结构一起工作?Include() 似乎不适用于它 ,如何使用实体框架进行递归加载?还有一堆其他的,他们都老了。
我发现的所有解决方案要么对层次结构的深度进行硬编码(使用Include),要么在 C# 中进行递归。所有这些,我的问题是最好的解决方案是什么?
我可以使用FromSqlRaw (类似下面的代码),但是我不喜欢在 C# 中手动编写查询。
var locations = DataContext.Locations
.FromSqlRaw("MyQuery").ToList();
Run Code Online (Sandbox Code Playgroud)
我在用EFCore 3.1.7
sql-server recursion hierarchy sql-cte entity-framework-core
我在数据库中有菜单表,它有自引用外键,即 ParentID。下面是我的菜单类(数据库优先方法)
public partial class Menu
{
public Menu()
{
this.Menu1 = new HashSet<Menu>();
this.Products = new HashSet<Product>();
}
public int MenuID { get; set; }
public string Name { get; set; }
public Nullable<int> ParentID { get; set; }
public virtual ICollection<Menu> Menu1 { get; set; }
public virtual Menu Menu2 { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想实施以下事情,