如何在LINQ to Entities中正确查询,同时返回文档及其所有附件条目?
解决方法:合并文档自身条目与附件条目
你的问题核心是当前的左连接查询只会在无附件时返回文档条目,有附件时只返回文档+附件的组合条目,没有单独的文档行。要实现始终包含文档条目+所有附件条目,我们需要把两个独立的查询结果合并起来:
思路拆解
我们需要分两部分构造查询,再将它们合并:
- 第一部分:单独获取符合条件的文档自身条目(AttachID设为null)
- 第二部分:获取该文档对应的所有附件条目(关联文档ID)
- 最后用
Concat或Union把这两部分结果合并(这里用Concat更高效,因为不会有重复数据)
修改后的代码示例
// 1. 查询文档自身的条目 var documentEntry = from d in Documents where d.StatusID != -1 && d.ID == 1 select new Result { ID = d.ID, AttachID = null // 标识这是文档自身的条目 }; // 2. 查询该文档的所有附件条目 var attachmentEntries = from d in Documents join at in Attachments on d.ID equals at.DocumentID where d.StatusID != -1 && d.ID == 1 select new Result { ID = d.ID, AttachID = at.ID }; // 3. 合并两个查询,得到最终的IQueryable var finalQuery = documentEntry.Concat(attachmentEntries);
为什么原查询达不到效果?
原查询用了DefaultIfEmpty的左外连接,逻辑是每个附件对应一条文档+附件的组合:
- 当有2个附件时,会生成2条(文档+附件1、文档+附件2),但不会单独生成文档自身的条目
- 只有当没有附件时,左连接才会生成1条(文档+null附件),这就是你看到的“仅无附件时返回纯文档条目”的原因
而修改后的方式,不管有没有附件,都会先返回1条文档自身的条目,再返回所有附件条目,完美实现1+N的结果数量。
内容的提问来源于stack exchange,提问作者Alexander Smirnov
相关产品推荐
相关产品推荐

