如何使用LINQ与Entity Framework合并三个查询的结果
解决LINQ查询结果合并的问题
嘿,我来帮你搞定这个LINQ合并查询的需求!首先先帮你修正下原来代码里的小语法问题,再给出合并查询的实现方法。
先修正原代码的语法错误
原代码里有几个C# LINQ的语法问题:
- 逻辑与应该用
&&而不是and - bool类型的条件直接写
x.IsMainPosition就可以,不用==true - 第二个查询里的变量
b应该是p(因为你用from p in ...定义的变量)
实现合并查询的方法
你的需求是:先找到新闻ID=4的主位置对应的分类ID,再获取该分类的名称(作为parentCat)以及该分类下所有子分类的名称(作为childCat),最终合并成指定的表格格式。
这里我们可以一步到位完成查询,不用分开三个查询:
// 1. 先获取新闻ID=4的主位置对应的分类ID(确保只取一个结果) var parentCatId = Dbcontext.tbl_NewsPosition .Where(x => x.Fk_NewsID == 4 && x.IsMainPosition) .Select(x => x.Fk_NewsCatId) .FirstOrDefault(); // 如果没有找到返回0,根据你的表结构调整 // 2. 合并查询父分类和对应的子分类(左连接确保没有子分类时也能显示父分类) var mergedResult = from parent in Dbcontext.tbl_Cat where parent.Id == parentCatId // 左连接子分类,关联父分类ID和子分类的父ID join child in Dbcontext.tbl_Cat on parent.Id equals child.Fk_ParentId into childGroup from child in childGroup.DefaultIfEmpty() select new { parentCat = parent.CatName, childCat = child?.CatName ?? string.Empty // 子分类为空时显示空字符串 };
输出指定格式的表格
如果要输出你示例中的表格样式,可以遍历查询结果来打印:
// 打印表头 Console.WriteLine("+-----------+----------+"); Console.WriteLine("| parentCat | childCat |"); Console.WriteLine("+-----------+----------+"); // 遍历结果打印每一行 foreach (var item in mergedResult) { // 格式化字符串,保证对齐 Console.WriteLine($"| {item.parentCat,-9} | {item.childCat,-8} |"); } // 打印表尾 Console.WriteLine("+-----------+----------+");
补充说明
- 用
FirstOrDefault()是为了避免tbl_NewsPosition中存在多个符合条件的记录导致的错误,如果你的业务逻辑保证只有一个主位置,也可以用SingleOrDefault() - 左连接(
join ... into ... DefaultIfEmpty())的作用是:即使该父分类没有子分类,也会返回一行父分类名称,子分类为空的结果,符合你示例中的空行情况
内容的提问来源于stack exchange,提问作者user3250818
相关产品推荐
相关产品推荐

