【问题标题】:Lambda expression tree for related entities相关实体的 Lambda 表达式树
【发布时间】:2014-11-02 18:42:20
【问题描述】:

希望创建一种通用查询构建器,其中我通过导航属性拥有相关实体。所以我希望能够这样说:

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) 包含在运行时传入的相关实体的查询树是什么样的?

【问题讨论】:

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

标签: c# linq entity-framework lambda navigation-properties


【解决方案1】:

嗯,我做过类似的事情。

我使用了 LINQ 表达式(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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多