相关实体的Lambda表达式树
本文关键字:表达式 Lambda 实体 | 更新日期: 2023-09-27 18:28:45
希望创建一种通用查询生成器,其中我通过导航属性拥有相关实体。所以我想说一些类似的话:
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) 有没有一种简单的方法可以获得我想查询的所有属性的单个集合,包括与实体a相距n个关系的相关实体的属性?
c) 查询树在包含运行时传入的相关实体时是什么样子的?
好吧,我也做了类似的事情。
我使用了LINQ表达式(System.LINQ.Expressions命名空间),还创建了小型解析器。
这花了我一些时间,但我对此非常满意,这是整个应用程序的一颗跳动的心,所以是的,它很有效,而且很明智。
回答b):
无论您在VS编辑器中用代码写什么,都可以通过LINQ表达式创建(express),因为编译器无论如何都是这样做的。有些方法更容易,比如Where()或Count(),有些方法更难,比如Join()或GroupBy(),但最终都可以完成。
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);
所以基本上,这不是很容易,可能不值得花时间(取决于你需要多少时间),但它是可以做到的,而且非常方便。