【发布时间】:2021-03-14 19:49:49
【问题描述】:
我想向您询问一种使用嵌套子集合动态创建 LINQ Select 表达式的方法。所选子集合中的字段可以是静态的,但是我想动态传递当前实体中的字段列表,以及导航属性引用的其他实体中的字段。 这是查询的静态版本,类似于我在代码中使用的那个,在很多地方,我想动态创建:
var listItems = _efDbContext.Blogs.Select(x => new {
ID = x.ID,
Name = x.Name, //field from the current entity
AuthorName = x.Author.Name, //field referenced by navigation property
...<other fields from current or referenced entities(like AuthorName above), passed dynamically>
Posts = x.Posts.Select(y => new { //this select is 'static', is the same for other queries
Id = x.Id,
Name = x.Name
})
});
我试图从这两个帖子的答案中找出一些东西,但我没有成功。 Ivan Stoev 的回答真的很酷,但它不支持引用属性,而且我在上面的示例中也有这个静态嵌套子集合选择
Dynamically build select list from linq to entities query
EF Linq- Dynamic Lambda expression trees
我也尝试过使用 Dynamic.Linq.Core 或 Automapper 之类的库来实现这一点,但似乎前者不支持对子集合进行选择,而后者需要一个 DTO 类,我不想为它创建数百个 DTO选择表达式中的每个字段组合。
我还认为整个方法可能过于复杂,也许我应该改用参数化 SQL 查询,这绝对是一个可能的选择,但我认为我可以在不同的变体中重用这个动态 LINQ 表达式,在我的其他地方项目,从长远来看会有所帮助:)
(我使用的是 EF Core 3.1)
【问题讨论】:
-
我没有看到创建此类查询的模式。动态表达式树也不会为您创建匿名类。
标签: c# linq lambda entity-framework-core expression-trees