我们希望建立一个与我们一起工作的所有组织的目录。他们是难以置信的多样化(政府,大使馆,私人公司和组织依赖于他们)。因此,我决定创建两个表。表1将平等对待所有组织,即收集所有基本信息(姓名、地址、电话号码等)。表2将在所有组织之间建立层次结构。例如,成人文盲方案依赖于国家社会保障研究所,该研究所依赖于劳工部。
在层次结构表中,每个列表示一个级别。因此,就上述例子而言,(一)劳动部- Level1(column1),(二)国家社会保障研究所- Level2(column2),(三)文盲成人方案- Level3(column3)。
要将组织附加到层次结构,用户需要逐级(即逐列)。因此,至少有3种情况:
如果一个组织存在适当的层次结构(例如,:美国大使馆),则可以添加该组织(例如,level2: USAID)。->美国大使馆/美国国际开发署,等等。如果缺少一个或多个级别,那么
我别无选择,只能按级别(即一列一列)工作。当用户需要导航层次结构以找到正确的层次来附加一个组织时,将所有的级别都以一种形式存在是没有意义的。
比方说,我的存储库中有这些查询(只是您有了这个想法)。
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说的那样,我想要的只是能够查询一个列,而事先不知道哪一列。看看这个:
这个怎么样?
Public Hierarchy GetHierarchy(string name)
{
var myHierarchy = from hierarc in db.Hierarchy
where (hierarc.Level1 == name)
select hierarc;
retuen myHierarchy;
}上面,查询取决于名称,它是一个变量。它可能是规划部,大使馆,当地电话等。
我可以写同样的查询,但是这次我没有在DB中查找大量的值,而是强制我的查询来选择一个特定的列。
var myVar = from orgH in db.Hierarchy
where (orgH.Level1 == "Government")
select orgH.where(level == myVariable);
return myVar;我并不假装select orgH.where(level == myVariable)甚至接近于有效。但这正是我想要的:能够根据变量选择一个列(也就是说,这个值事先不知道,比如name)。
谢谢你的帮助
发布于 2010-03-30 15:39:12
使用DynamicQueryable怎么样?
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
发布于 2010-03-30 13:11:53
您的数据库没有标准化,因此您应该首先将继承表更改为,例如:
OrganizationId Parent
1 NULL
2 1
3 1
4 3要查询这一点,您可能需要使用递归查询。使用LINQ很难(但并非不可能),因此您可能更喜欢使用递归CTE创建参数化存储过程并将查询放在那里。
https://stackoverflow.com/questions/2545346
复制相似问题