DynamicQuery:如何选择带有参数的linq查询的列

时间:2010-03-30 13:05:47

标签: linq-to-sql linq-to-entities

我们希望设置与我们合作的所有组织的目录。它们非常多样化(政府,大使馆,私营公司和组织取决于它们)。所以,我决定创建2个表。 表1 将平等对待所有组织,即它将收集所有基本信息(姓名,地址,电话号码等)。 表2 将在所有组织之间建立层次结构。例如, 文盲成人计划 取决于 国家社会保障协会 ,这取决于 劳工部

在“层次结构表”中,每列代表一个级别。因此,对于上面的例子,(i)劳工部 - 第1级(第1栏),(ii)国家社会保障研究所 - 第2级(第2栏),(iii)文盲成人计划 - 第3级(第3栏)。

要将组织附加到层次结构,用户需要逐级进行(即逐列)。因此,至少会有3种情况:

  • 如果组织存在足够的层次结构(例如,level1:US Embassy),则可以添加该组织(例如,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 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 )。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您的数据库未规范化,因此您应该首先将层次结构表更改为,例如:

OrganizationId Parent
1              NULL
2              1
3              1
4              3

要查询此信息,您可能需要使用递归查询。使用LINQ很难(但并非不可能),因此您可能更喜欢使用递归CTE创建参数化存储过程并将查询放在那里。

答案 1 :(得分:1)