- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
场景
我构建了一个表示类别树的数据库结构,以帮助对我们存储的一些数据进行分类。具体实现是,Category
表中的每条记录都有一个可以为空的外键返回到 Category
表中,以表示该类别的父 Category
(一对多),本质上允许在更广泛的父级中存在子类别。有一个 CategoryMembership
表将 Item
表中的记录链接到其各自的 Category
(多对多)。我已经为此数据库创建了 DBML,它有一个成员访问结构,其中包括以下内容:
Dim aCategory As New Category()
Dim aParentCategory As Category = aCategory.Parent
Dim aChildCategoryCollection As EntitySet(Of Category) = aCategory.Subcategories
Dim aMembershipCollection As EntitySet(Of CategoryMembership) = aCategory.CategoryMemberships
aMembershipCollection
中的每个项目都具有以下成员访问结构:
Dim aMembership As CategoryMembership = aMembershipCollection.First()
Dim aLinkedCategory As Category = aMembership.Category
Dim aLinkedItem As Item = aMembership.Item
要求
我正在尝试构建一个 LINQ 表达式,它允许我确定哪些 Items
具有适用于所请求的 Category
的 CategoryMemberships
(即aCategory.id = myID
) 或请求的 Category
后代的成员资格,想法是我想要父类别中的所有 Items
或其多个级别的子类别。
本质上,查询将以类似于以下的方式构建:
Dim results As IQueryable(Of Item) = _
From cm In db.CategoryMemberships.Where(myInCategoryPredicate(myID)) _
Select cm.Item
...其中 myInCategoryPredicate
返回 LINQ 表达式对象,该对象将帮助我做出该决定。当然,这是基于以下假设:CategoryMembership
表是开始检索IQueryable(Of Item)
的位置。我可能在这里做出了错误的假设,这就是我来寻求建议的原因。
问题
我很难只见树木不见森林。我无法确定是否应该从 Category 或 CategoryMembership 开始构建谓词,也无法理解完成我想要的任务所需的代码。我希望已经为数据库构建了类似树结构的其他人能够帮助我了解 DBML 类。
可用资源
我之前使用过 PredicateBuilder在过去,我相对熟悉它的工作原理,但我无法设计出一种方法来向上遍历树并递归地构建一个谓词来指示项目是否属于请求的类别或其子。到目前为止,我已经生成了以下内容,其中非常明显的间隙标记为 SomeRecursiveCall():
Private Function InCategory(ByVal myID As Integer) As Expression(Of Func(Of CategoryMembership, Boolean))
Dim predicate = PredicateBuilder.False(Of CategoryMembership)()
predicate = predicate.Or(Function(cm) cm.fkCategoryID = myID OrElse SomeRecursiveCall())
Return predicate
End Function
但是,我意识到谓词构建器在这里可能没有任何用处,并且可能需要不同的方向。
我认为总是有可能为请求的 ID 选择 Category
记录,并从中递归地构建 ID 列表以及 Subcategories
的所有成员使用该列表来评估该列表上的 .Contains() 比较,但我想知道是否没有其他选项不太让人感觉那么丑陋。
最佳答案
您无法在 linq to sql 查询中执行数据限制递归(您希望递归直到没有更多数据可供获取)。这是因为查询翻译器需要知道何时停止生成查询,并且它无法查看数据来知道这一点。
您可以使用 Common Table Expression在 TSql 中执行数据限制递归...如果您只是将该 CTE 放入 View 中,则可以从 linq 到 sql 查询该 View 。
关于vb.net - 构建 LINQ 表达式以查找与树节点的所有后代相关的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5225568/
我有一个表(id, parent_id, data),其中parent_id 指向同一表中的另一行(或者为空)。 是否有一种标准的方法来查询(1)某个 id 的所有祖先和(2)某个 id 的所有后代?
networkx 中是否有函数/方法来识别给定(可选加权)距离内的所有祖先/后代? 例如,可以有效地产生与下面的函数相同的结果的东西? import networkx g = networkx.DiG
在我的窗口事件中,如果指针点击父对象或其子对象/后代对象,它应该做一些事情。问题是事件无法访问 parent 的 child 和孙子。条件存储在 targetIsInsideParent 变量中。 H
我有一个非常好的 DirectMySQL 单元,可以使用,我希望它成为 TDataset 的后代,这样我就可以将它与 QuickReport 一起使用,我只想要使用来自 TDataset 的 Dire
我将 mysql 表定义为: 类别:category_id、category_name、parent_category_id 我正在寻找一个很好的 sql 查询来检索给定 category_id 的所
我的 TCustomControl 后代使用线程,这涉及使用 InvalidateRect 进行无效化。我遇到这样的情况:当线程正在工作时关闭程序时,我不会停止 Destroy 中的线程,因为即使在进
我的 TMemo 后代有构造函数 constructor TMyMemo.Create(AOwner: TComponent); begin inherited Create(AOwner);
我正在尝试创建一个像Delphi 2009的TButtonedEdit这样的组件。它是一个自定义的TEdit,左右各有2个按钮。 在我的版本中,我使用 2 个 TSpeedButton 对象作为左右按
我遇到了一些问题,看起来使用 JQuery 应该很容易做到。基本上我的页面上有一个表格。表格中的每一行都有一个复选框和一个金额单元格。我正在尝试编写一个函数来遍历每一行并检查复选框是否已选中。如果是这
如何使用 linq 对包含相同对象的子集合 X 层深的对象集合获得与 doc.Descendants() 类似的功能? 最后一个嵌套集合包含需要获取的数据,所有其他父集合只是分组。我可以将集合转换为
我有一个引用自身的表,如下所示: CREATE TABLE Foo ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, parent INT NULL, nam
我正在尝试添加以下约束来对齐表格单元格内的图像。 self 指的是 ImageView 将驻留在其中的 UITableViewCell 对象: var imageViewTest = UIIm
我有以下标记: content Link Link Link
这里是一个简化的mxl结构'xml', Alice30 Bob31 Charley29 Dory25 这是我尝试过的; XmlDocument submiss
我正在尝试编写一个类,该类将在其对象创建时运行一个线程,并在对象被删除后停止该线程。 class MyThread : public boost::thread { public: MyThr
我有一个表 width: 100%以及该表中的元素 width: 40em; max-width: 100% , 但当浏览器窗口太小时,该元素仍在拉伸(stretch)表格。 我希望这个元素的宽度固定
我正在尝试在 Delphi 2007 中创建基于 TCustomComboBox 的自定义控件,但我陷入了第一个障碍。 我试图覆盖下拉列表的显示方式,主要是显示的文本,查看 stdctrls.pas
我正在尝试创建一个具有集合属性的自定义组件。但是,如果我尝试在设计时通过单击对象检查器中的“...”按钮来打开集合编辑器,则不会发生任何情况。我缺少什么? 这是我的 TCollection 后代:
我正在使用WPF DataGrid,并放置了DataGridTemplateColumn。因为该列应该对复杂类型(这是一个对象)执行编辑,所以我决定放置一个打开弹出窗口的切换按钮。代码如下:
我有一个基本的 UserControl (BaseControl.cs),上面有一个 OK 和 Cancel 按钮。单击按钮时,将触发一个事件。通常其他 UserControl 对象继承自 BaseC
我是一名优秀的程序员,十分优秀!