使用linq进行动态查询

时间:2014-06-09 06:20:22

标签: c# sql linq entity-framework dynamic-queries

我有一个包含EntityName和EntityIds的审核模型。

我正在寻找一种创建动态查询的方法,该方法将从此表中检索EntityRecord及相关实体

这是我到目前为止所拥有的

var auditRows = from a in context.Audit
                where (a.EntityName == entityName && a.EntityKey == entityKey);

我想得到的是,如果一个实体,说“班级”有相关实体“学生”。我想要创建一个动态查询,将where子句创建为

where (a.EntityName == entityName && a.EntityKey == entityKey) ||
      (a.EntityName == "Students" && context.Students.Where(s => s.ClassID == entityKey)

我找到了获取相关实体的方法

var objectContext = ((IObjectContextAdapter)context).ObjectContext;
var container = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace);
var relatedEntitySets = container.EntitySets.Where(es => es.ElementType.Name == entitySet).First().ElementType.NavigationProperties

但我不知道如何构建查询或者是否有更好的方法来创建查询。

1 个答案:

答案 0 :(得分:0)

我认为你只需要摆脱WHERE并替换为ANY:

var students = context.GetTable<Students>();
// Repeat for other tables

where (a.EntityName == entityName && a.EntityKey == entityKey) ||
      (a.EntityName == "Students" && students.Any(s => s.ClassID == entityKey) ||
      (a.EntityName == "People" && people.Any(s => s.ClassID == entityKey) ||
      (a.EntityName == "FOO" && foo.Any(s => s.Bar == entityKey)

Any会生成你想要的WHERE EXISTS()。