2014-11-02 81 views
0

寻找创建一种通用查询生成器,其中通过导航属性具有相关实体。所以我想能够这样说:相关实体的Lambda表达式树

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)是否有一种简单的方法可以获得我想要查询的所有属性的单个集合,包括相关实体的属性n远离entityA的关系的数量?

c)查询树在运行时传入的相关实体的外观如何?

+0

我肯定会从Dynamic Linq开始。优点是已经实施。查询作为字符串传递,因此您的动态where子句将是'.Where(“NavigationProperty.PropertyZ = \”value1 \“”)''。 – 2014-11-02 20:21:14

回答

0

好吧,我做了类似的事情。我已经使用了LINQ表达式(System.Linq.Expressions命名空间),并且我也创建了一个小解析器。

我花了一些时间,但我非常满意,它是整个应用程序的跳动心脏,所以是的,它的工作原理,它是明智的。你可以通过LINQ表达式创建(表达),因为编译器无论如何都是这样的。不管你在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); 

因此,基本上,它不是很容易的,它可能不值得花时间(取决于你有多需要它),但它可以完成,可以来非常方便。