Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 相关实体的Lambda表达式树_C#_Linq_Entity Framework_Lambda_Navigation Properties - Fatal编程技术网

C# 相关实体的Lambda表达式树

C# 相关实体的Lambda表达式树,c#,linq,entity-framework,lambda,navigation-properties,C#,Linq,Entity Framework,Lambda,Navigation Properties,希望创建一种通用查询生成器,通过导航属性在其中创建相关实体。所以我想说的是: var results = from entityA in context.entityAs where entityA.NavigationPropertyB.PropertyZ = value1 group entityA by entityA.NavigationPropertyC.PropertyY into g select new { propertyY = g.Key, value = g.O

希望创建一种通用查询生成器,通过导航属性在其中创建相关实体。所以我想说的是:

var results = from entityA in context.entityAs  
where entityA.NavigationPropertyB.PropertyZ = value1  
group entityA by entityA.NavigationPropertyC.PropertyY into g  
select new { propertyY = g.Key, value = g.OperatorD(x=>x.PropertyX)}
其中,实体A、相关属性和运算符可以动态提供。我正在考虑获取给定实体类型的属性集合,并使用它们构建动态查询的lambda表达式树

a那行吗?这明智吗

b有没有一种简单的方法可以获取我想要查询的所有属性的单个集合,包括相关实体上的属性n远离实体a的关系数


包含运行时传入的相关实体的查询树是什么样子的?

我也做过类似的事情

我使用了LINQ Expressions System.LINQ.Expressions名称空间,还创建了小型解析器

这花了我一些时间,但我非常高兴,它是整个应用程序的心脏跳动,所以是的,它是有效的,它是明智的

回答b: 无论您可以在VS编辑器的代码中编写什么,都可以通过LINQ表达式创建express,因为编译器就是这样做的。有些方法更简单,比如Where或Count,有些更难,比如Join或yourgroupby,但最终,一切都可以完成

c 无论您是静态地编写查询,还是在运行时动态地构造查询,表达式树看起来都是一样的,只有在具体化时才会对其求值

下面是一个例子:

string query = "db.Documents.Count() != 0 ? db.Documents.Where(d => d.No == 176).Items.Select(a => a.Debit).Sum() : 0";
var result = ExprBuilder.DoExpression(new MyDbContext(), query);

因此,基本上,这并不容易,可能不值得花时间,这取决于您需要多少时间,但这是可以做到的,而且非常方便。

我肯定会从动态Linq开始。优点是已经实现了。查询是作为字符串传递的,因此动态where子句应该是.where NavigationProperty.PropertyZ=\value1\。