Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq的动态查询_C#_Sql_Linq_Entity Framework_Dynamic Queries - Fatal编程技术网

C# 使用linq的动态查询

C# 使用linq的动态查询,c#,sql,linq,entity-framework,dynamic-queries,C#,Sql,Linq,Entity Framework,Dynamic Queries,我有一个包含EntityName和EntityID的审计模型 我正在寻找一种创建动态查询的方法,该查询将从此表中检索EntityRecord和相关实体 这就是我目前所拥有的 var auditRows = from a in context.Audit where (a.EntityName == entityName && a.EntityKey == entityKey); 我想得到的是,如果一个实体,比如说班级有相关的实体学生。我想创建一个

我有一个包含EntityName和EntityID的审计模型

我正在寻找一种创建动态查询的方法,该查询将从此表中检索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

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

我认为您只需要去掉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将生成所需的位置。

您实际需要做的是执行joinoperation@Milo,你想得到什么样的结果对我来说并不清楚。ID=1,Name=Class1,学生记录ID=1,Name=Student1,ClassID=1的班级记录。我想查询审计表,从ClassID=1的学生的SELECT Id中检索EntityName=Class&&EntityID=1 | | EntityName=Student&&EntityID的数据。有点像这样,但是如果EntityName=School,我不需要在where子句中添加Student,因为School和Student没有关系。在这种情况下,学生和学生属于不同的领域。把它们混在一起是不明智的。实际上,问题是——谁是这种动态查询结果的消费者?这真的可以与任何类的任何组合一起使用吗?我想那太有活力了。我建议使用类似于可插拔接口的东西,它的工作取决于“已审核”实体的静态类型。是的,这是正确的。但我想创建的是一个相关实体的动态查询。e、 学生们,人们,FOO。你所拥有的就是我目前正在做的,我只是在寻找一种更为动态的方式。那么你希望它基于实体名称和相关数据属性来查找实体学生?这一部分是可能的,您可以使用反射来获取属性等,但我知道没有办法像这样构造linq到实体查询。您需要全部指定它们。您可以将实体名称放入实体名称上的switch语句中,但上面只有一个或多个语句可以帮助提高性能:case Students:auditRows=auditRows.where=>a.EntityName==EntityName&&a.EntityKey==EntityKey | | Students.Anys=>s.ClassID==EntityKey;