用LINQ方法语法实现左连接 无匹配项时返回自定义提示文本
问题原因
你当前使用的Join方法属于LINQ的内连接,仅会返回左右两边匹配成功的条目,因此没有对应产品的分类会被直接过滤掉。要实现需求的左外连接效果,需要改用GroupJoin方法搭配DefaultIfEmpty处理无匹配的场景。
另外你原有代码的关联键存在错误:产品侧的关联选择器product => product是直接拿Product对象和分类字符串匹配,永远无法命中,需要改为产品对应的分类属性,假设Product类的分类字段为Category。
调整后的完整代码
public static IEnumerable<(string category, string productName)> LeftOuterJoin() { string[] categories = { "Beverages", "Condiments", "Vegetables", "Dairy Products", "Seafood" }; List<Product> products = Products.ProductList; return categories // 左表是分类,和产品做分组连接,得到每个分类对应的产品组 .GroupJoin( products, category => category, product => product.Category, // 产品侧取分类字段做关联键,属性名不匹配可自行修改 (category, productGroup) => new { category, productGroup }) // 拆分分组,对无产品的组返回默认值(null)保证分类不丢失 .SelectMany( joinResult => joinResult.productGroup.DefaultIfEmpty(), (joinResult, product) => new { joinResult.category, ProductName = product == null ? "(No Products)" : product.ProductName }) // 投影为要求的元组类型 .Select(res => (res.category, res.ProductName)); }
效果说明
上述代码会完整返回所有分类:
- 分类下有多个产品的会拆分出多条对应记录
- 分类下无产品的会自动补
(No Products)作为产品名,符合你给出的输出格式要求 - 全程使用方法语法实现,返回类型完全匹配要求
内容的提问来源于stack exchange,提问作者Liviu Ganea
相关产品推荐
相关产品推荐

