Linq to sql DynamicQuery:如何使用接受参数的linq查询选择列

Linq to sql DynamicQuery:如何使用接受参数的linq查询选择列,linq-to-sql,linq-to-entities,Linq To Sql,Linq To Entities,我们想建立一个与我们合作的所有组织的目录。它们的多样性令人难以置信(政府、大使馆、私人公司和依赖它们的组织)。因此,我决定创建两个表表1将平等对待所有组织,即收集所有基本信息(姓名、地址、电话号码等)表2将建立所有组织之间的层次结构。例如,文盲成人计划依赖于国家社会保障研究所,该研究所依赖于劳动部 在层次结构表中,每列代表一个级别。因此,在上面的例子中,(i)劳动部一级(第1栏),(ii)国家社会保障研究所二级(第2栏),(iii)成人文盲计划三级(第3栏) 要将组织附加到层次结构,用户需要逐级

我们想建立一个与我们合作的所有组织的目录。它们的多样性令人难以置信(政府、大使馆、私人公司和依赖它们的组织)。因此,我决定创建两个表表1将平等对待所有组织,即收集所有基本信息(姓名、地址、电话号码等)表2将建立所有组织之间的层次结构。例如,文盲成人计划依赖于国家社会保障研究所,该研究所依赖于劳动部

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

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

  • 如果某个组织存在适当的层次结构(例如,级别1:美国大使馆),则可以添加该组织(例如,级别2:美国国际开发署)。->美国大使馆/美国国际开发署,依此类推
  • 如果缺少一个或多个级别,情况如何然后需要添加它们
  • 如果需要修改层次结构如何?--并非每件事都需要修改
我别无选择,只能按级别(即逐列)工作将所有级别放在一个表单中是没有意义的,因为用户需要浏览层次结构以找到合适的层次结构来附加组织。

比方说,我在我的存储库中有这些查询(只是为了让您了解这个想法)

问题1

var orgHierarchy = (from orgH in db.Hierarchy
                   select orgH.Level1).FirstOrDefault;
问题2

var orgHierarchy = (from orgH in db.Hierarchy
                   select orgH.Level2).FirstOrDefault;
问题3、问题4等

除了查询的属性(level1、level2、level3等)之外,上述查询是相同的

问题:是否有一种通用的方法将上述查询写在一个数据库中?因此,用户可以逐级跟踪层次结构以附加组织

换句话说,由于事先不知道要查询哪个列,我仍然需要能够根据某些条件进行查询。例如,一个组织X依赖于Y。知道Y在第三层的某个地方,我将转到第四层,将X链接到Y

我需要选择(不是手动)一个列,该列只有一个接受参数的查询

======================= 编辑

正如我刚才对@markbyers所说的,我只想能够查询一个列,而不必事先知道是哪个列。看看这个:

这个怎么样

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;
我不会假装select orgH.where(level==myVariable)甚至接近有效。但这正是我想要的:能够根据变量选择一列(即,与name一样,该值事先不知道)


感谢您的帮助

您的数据库未规范化,因此您应该首先将继承人权限表更改为,例如:

OrganizationId Parent
1              NULL
2              1
3              1
4              3

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

使用DynamicQueryable如何


@Mark Byers——我所需要的只是能够查询一个列,而不知道该列是哪一列。例如,我可以选择选择第一列--我将编写select orgH.Level1,第二列--我将编写select orgH.Level2,依此类推。有一个表达式,比如select orgH.where(columnName==variable),怎么样?变量可能是level1、level2等等@SteadyEddi-我刚刚读了ScootGu的帖子。看起来像是我想要的。我会尝试利用它。所以,我可能需要你们提供一些想法。@SteadyEddi--谢谢你们的链接。我试过了,这正是我想要的。在我添加Select语句之前,一切都很正常。然而(不幸的是),这就是我问题的目的。例如,选择(“new(Name=Director)”)。当我尝试在Foreach(电影中的var monie)循环中检索该值时,不仅在“movie”后键入一个点后无法获得intellisense,而且,如果键入的是movie.Director或movie.Name,则会出现一个错误——对象不包含Director(Name)的定义。我可以利用select语句吗?我认为intellisense的可能性不大,因为对象是基于字符串动态构建的。您必须使用反射(GetProperty)来获取您创建的匿名对象的属性。您可以发布一个示例或给我指出一个示例吗?我最近学习了如何使用getProperty,但我需要将它与dynamicQuery结合起来。