多属性GroupBy结合Union/Concat的LINQ查询为何无法运行?
LINQ多属性GroupBy结合Union/Concat在Entity Framework中的问题
以下是简化后的LINQ代码:
// Query block. var parentQuery = from p in db2.Things where p.Parent == null group p by p.Id into g select new Temp { Id = g.Key.ToString() + "P", ParentId = null, }; // Reused query block. var childQuery = from c in db2.Things where c.Parent != null // 问题似乎出在这个多属性GroupBy上 group c by new { c.Id, c.Name, } into g select new Temp { Id = g.Key.Id.ToString() + g.Key.Name, ParentId = (g.Key.Id - 1).ToString() + "P", }; // Combined/main query. var query = from t in parentQuery.Union(childQuery) join child in childQuery on t.Id equals child.ParentId into children select new { Id = t.Id, Children = children .Select(c => new { Id = c.Id, }) .AsEnumerable(), };
问题核心:childQuery中的多属性GroupBy操作导致查询失败,将其改为单属性GroupBy后查询可正常运行。原本认为Union操作能保证合并后的父、子行唯一,GroupJoin可以正常工作,但Entity Framework出现异常。
相关现象:
- 仅使用
parentQuery或childQuery替代Union时查询正常,但会丢失部分数据; - 移除输出中的
Children属性时查询正常,但该属性是业务必需的; - 当Union的两个参数都使用
parentQuery或都使用childQuery时查询正常,推测是Entity Framework进行了特殊优化。
背景说明:最初实现是用FromSql编写父、子查询,Entity Framework可以正常组合这些查询块。现在希望摆脱硬编码SQL,但如果是Entity Framework本身的限制,也可以考虑用Query替代FromSql。
能否使用Concat替代Union?
在当前场景中,Union和Concat的执行结果一致,逻辑上Concat才是预期的操作。如果主问题有解决方案,能否用Concat替代Union?
内容的提问来源于stack exchange,提问作者ricksmt
相关产品推荐
相关产品推荐

