Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用LINQ和LINQ to SQL从外键表获取_Linq_Linq To Sql - Fatal编程技术网

使用LINQ和LINQ to SQL从外键表获取

使用LINQ和LINQ to SQL从外键表获取,linq,linq-to-sql,Linq,Linq To Sql,我有一个名为MenuItem(MenuItemID、ParentMenuItemID、MenuItemName)的数据库表。我想用它来填充菜单控件(可能是.NET菜单控件) 每个菜单项都有一个父菜单项。如果没有父项,则它是顶级菜单项。我已经创建了一个映射到MenuItem表的LINQ-to-SQL类。由于我的表本身有一个从ParentMenuItemID到MenuItemID的外键,因此自动生成的MenuItem类包含一个MenuItem集合。此集合应包含菜单项的所有子项 结果应存储在列表中 是

我有一个名为MenuItem(MenuItemID、ParentMenuItemID、MenuItemName)的数据库表。我想用它来填充菜单控件(可能是.NET菜单控件)

每个菜单项都有一个父菜单项。如果没有父项,则它是顶级菜单项。我已经创建了一个映射到MenuItem表的LINQ-to-SQL类。由于我的表本身有一个从ParentMenuItemID到MenuItemID的外键,因此自动生成的MenuItem类包含一个MenuItem集合。此集合应包含菜单项的所有子项

结果应存储在列表中

是否可以在一个查询中获取:

  • 所有顶级菜单项
  • 将所有子菜单项添加到在其父对象下收集的顶级菜单项

获取顶级菜单项,然后迭代它们并查询每个子菜单项,或者获取所有菜单项,然后将它们放入正确的父菜单项中,这应该不会有任何问题。但是如果这可以在一个查询中完成。。。我很高兴:)

如果Linq to Sql模型本身有一个导航属性,那么:

dataContext.MenuItem
.Where(m=>m.ParentMenuItemId==null)
.Select(m=> new {TopLevelItem = m,Children = m.Children})

否则,您可以将m.Children替换为
dataContext.MenuItem.Where(c=>c.ParentMenuItemId==m.MenuItemId)

您可以尝试使用DataLoadOptions.LoadWith方法
但是,Microsoft LINQ to SQL Server不支持此方案,只有针对Oracle、MySQL、PostgreSQL和SQLite的Devart实现才支持此方案
德瓦特团队

用于Oracle、MySQL、PostgreSQL和SQLite的ADO.NET数据提供程序 实体框架和LINQ到SQL支持