相关实体的Lambda表达式树

时间:2014-11-02 18:42:21

标签: 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.OperatorD(x=>x.PropertyX)}

可以动态提供entityA,相关属性和运营商。我正在考虑获取给定实体类型的属性集合,并使用它们来构建动态查询的lambda表达式树。

a)那有用吗?这是明智的吗?

b)是否有一种简单的方法可以获取我想要查询的所有属性的单个集合,包括相关实体的属性以及远离entityA的多个关系?

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

1 个答案:

答案 0 :(得分:0)

好吧,我做了类似的事情。

我使用过LINQ Expressions(System.Linq.Expressions命名空间),我也创建了小解析器。

我花了一些时间,但我对它非常满意,它对整个应用来说是一颗跳动的心脏,所以是的,它有效,而且是明智的。

回答b):
无论你在VS编辑器中编写什么代码,你都可以通过LINQ表达式创建(表达),因为无论如何编译都是这样。有些方法比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);

所以基本上,它不是很容易,它可能不值得花时间(取决于你需要它多少),但它可以完成并且可以非常方便。