重复 many times over(以及these)
我有一个名为Types的表,其中包含以下列。
ID 水平 名称 ParentID(父行的ID)
和一个名为ParentObject的表,其中包含以下列。 ID TYPEID
有4个不同的级别(可能会扩展到更多)。
所以,如果我有
ID:1 等级:0 名称:Level0 ParentID:null
ID:2 1级 名称:Level1 ParentID:1
ID:3 等级:2 名称:Level2 ParentID:2
ID:4 等级:3 名称:Level3 ParentID:3
ID:5 等级:4 姓名:Level4 ParentID:4
在ParentObject表中,我只存储最低级别的ID来存储树。因此,如果我拥有的ID是4,我知道该树实际上是Level0 - > Level1 - > Level2 - >级别3
基本上,我需要能够搜索特定类型的所有对象,或者在linq语句中搜索类型2。
假设存储在ParentObject表中的TypeID是4,那么Level3。
但实际上我想搜索Level 2类型ID为3的所有ParentObjects。
这样做的最佳方式是什么,因为存储的id可能是level1或level2等?
如果可能,最好在一个linq声明中。
答案 0 :(得分:0)
在SQL(MS SQL Server 2005+)中,您可以使用Common Table Expression来实现递归。 LINQ不支持CTE。一些解决方法是创建存储过程并将其作为方法映射到数据上下文。
另一种解决方案是直接在C#代码中编写SQL并让LINQ执行它。请参阅this。
或者您可以编写一些C#代码,从您的数据中选择,直到没有更多的父ID。一个粗略的例子是......
public partial class Form1 : Form
{
public Form1()
{
IList<Data> data = new List<Data>();
data.Add(new Data() { ID = 1, ParentID = 0, SomeData = "Example" });
data.Add(new Data() { ID = 2, ParentID = 1, SomeData = "Another Example" });
data.Add(new Data() { ID = 3, ParentID = 2, SomeData = "Example three" });
data.Add(new Data() { ID = 4, ParentID = 3, SomeData = "Last example" });
IList<Data> results = new List<Data>();
Int32 parentID = 2;
while (parentID > -1)
{
results.Add(
data.Where(x => x.ParentID == parentID).Single()
);
parentID--;
}
}
}
public class Data
{
public Int32 ID { get; set; }
public Int32 ParentID { get; set; }
public String SomeData { get; set; }
}
希望这有帮助!