我们希望设置与我们合作的所有组织的目录。它们非常多样化(政府,大使馆,私营公司和组织取决于它们)。所以,我决定创建2个表。 表1 将平等对待所有组织,即它将收集所有基本信息(姓名,地址,电话号码等)。 表2 将在所有组织之间建立层次结构。例如, 文盲成人计划 取决于 国家社会保障协会 ,这取决于 劳工部 。
在“层次结构表”中,每列代表一个级别。因此,对于上面的例子,(i)劳工部 - 第1级(第1栏),(ii)国家社会保障研究所 - 第2级(第2栏),(iii)文盲成人计划 - 第3级(第3栏)。
要将组织附加到层次结构,用户需要逐级进行(即逐列)。因此,至少会有3种情况:
我没有任何选择,只能按级别(即逐列)工作。 我没有意义在一个表单中包含所有级别,因为用户需要导航层次结构以找到合适的附加组织。
让我们说,我在我的存储库中有这些查询(只是你得到了这个想法)。
Query1
var orgHierarchy = (from orgH in db.Hierarchy
select orgH.Level1).FirstOrDefault;
QUERY2
var orgHierarchy = (from orgH in db.Hierarchy
select orgH.Level2).FirstOrDefault;
Query3,Query4等
除了查询的属性(level1,level2,level3等)之外,上述查询是相同的
问题:是否有将上述查询编写在一个中的一般方法?这样用户就可以逐级跟踪层次结构以附加组织。
换句话说,不知道要提前查询哪一列,我仍然需要能够根据某些条件这样做。例如, X 的组织取决于 Y 。知道Y在第3级的某个位置,我将进入第4级,将 X 连接到 Y 。
我需要选择(不是手动)只有一个带参数的查询的列。
======================= 修改
正如我刚刚对@Mark Byers所说的,我想要的只是能够查询一个事先不知道哪一列。看看这个:
这个怎么样
Public Hierarchy GetHierarchy(string name)
{
var myHierarchy = from hierarc in db.Hierarchy
where (hierarc.Level1 == name)
select hierarc;
retuen myHierarchy;
}
上面,查询取决于名称,它是一个变量。它可以是规划部,大使馆,本地电话等。
我可以编写相同的查询,但这次不是在数据库中查找太多值,而是强制查询选择特定列。
var myVar = from orgH in db.Hierarchy
where (orgH.Level1 == "Government")
select orgH.where(level == myVariable);
return myVar;
我不假装选择orgH.where(level == myVariable)甚至接近有效。但这就是我想要的:能够根据变量选择一个列(即预先不知道该值,如 name )。
感谢您的帮助
答案 0 :(得分:1)
您的数据库未规范化,因此您应该首先将层次结构表更改为,例如:
OrganizationId Parent
1 NULL
2 1
3 1
4 3
要查询此信息,您可能需要使用递归查询。使用LINQ很难(但并非不可能),因此您可能更喜欢使用递归CTE创建参数化存储过程并将查询放在那里。
答案 1 :(得分:1)