LINQ联接查询

    public class Category
    {
        public int IdCategory { get; set; }
        public string Name { get; set; }
    }

    public class Product
    {
        public string IdProduct { get; set; }
        public int IdCategory { get; set; }
        public string Description { get; set; }
    }

    class Program
    {
        List<Category> categories = new List<Category>(){
               new Category{ IdCategory=1, Name="Pasta"},
               new Category{ IdCategory=2, Name="Beverages"},
               new Category{ IdCategory=3, Name="Other Food"}
               };
        List<Product> products = new List<Product>(){
                new Product{ IdCategory=1, IdProduct="PASTA01", Description="Tortellini"},
                new Product{ IdCategory=1, IdProduct="PASTA02", Description="Spaghtti"},
                new Product{ IdCategory=1, IdProduct="PASTA03", Description="Fusilli"},
                new Product{ IdCategory=2, IdProduct="BEV01", Description="Water"},
                new Product{ IdCategory=2, IdProduct="BEV02", Description="Orange Juice"}
            };

        static void Main(string[] args)
        {
            Program p = new Program();
            p.InnerJoin();
            p.GroupJoin();
            p.LeftJoin();
        }

        public void InnerJoin()
        {
            Console.WriteLine("------InnerJoin Test-----");
            //扩展方法
            var categoriesAndProducts =
                categories.Join(products,
                               c => c.IdCategory,
                               p => p.IdCategory,
                               (c, p) => new { c.IdCategory, CategoryName = c.Name, ProductDescription = p.Description }
                                   );
            //查询表达式
            //var categoriesAndProducts =
            //    from c in categories
            //    join p in products on c.IdCategory equals p.IdCategory
            //    select new { c.IdCategory, CategoryName = c.Name, ProductDescription = p.Description };

            //没有IdCategory=3的商品,所以不显示Other Food的Category
            foreach (var item in categoriesAndProducts)
            {
                Console.WriteLine(item);
            }
        }

        //分组查询在SQL中没有对应
        public void GroupJoin()
        {
            Console.WriteLine("------GroupJoin Test-----");
            //扩展方法
            var categoriesAndProducts =
                categories
                .GroupJoin(products,
                           c => c.IdCategory,
                           p => p.IdCategory,
                           (c, p) => new { c.IdCategory, CategoryName = c.Name, Products = p }
                           );
            //查询表达式
            //var categoriesAndProducts =
            //    from c in categories
            //    join p in products on c.IdCategory equals p.IdCategory
            //         into productByCategory
            //    select new { c.IdCategory, CategoryName = c.Name, Products = productByCategory };

            foreach (var category in categoriesAndProducts)
            {
                Console.WriteLine("{0} - {1}", category.IdCategory, category.CategoryName);
                foreach (var product in category.Products)
                    Console.WriteLine("\t{0}", product.Description);
            }
        }

        //左外连接,包含所有外部源的内容,即使它缺少对应内部源的内容
        public void LeftJoin()
        {
            Console.WriteLine("------LeftJoin Test-----");

            //扩展方法
            var categoriesAndProducts =
                categories
                .GroupJoin(products,
                           c => c.IdCategory,
                           p => p.IdCategory,
                           (c, p) => new { c.IdCategory, CategoryName = c.Name, Products = p }
                           );
            foreach (var g in categoriesAndProducts)
            {
                var temp = g.Products
                           .DefaultIfEmpty(new Product { IdCategory = 0, Description = string.Empty, IdProduct = string.Empty })
                           .Select(p => new { g.IdCategory, g.CategoryName, p.Description });
                foreach (var item in temp)
                {
                    Console.WriteLine(item);
                }
            }

            //查询表达式
            //var categoriesAndProducts =
            //    from c in categories
            //    join p in products on c.IdCategory equals p.IdCategory
            //         into productByCategory
            //    from pc in productByCategory.DefaultIfEmpty(
            //         new Product { IdCategory = 0, Description = string.Empty, IdProduct = string.Empty })
            //    select new { c.IdCategory, CategoryName = c.Name, ProductDescription = pc.Description };

            ////没有IdCategory=3的商品,也显示
            //foreach (var item in categoriesAndProducts)
            //{
            //    Console.WriteLine(item);
            //}
        }
    }
原文地址:https://www.cnblogs.com/FlyCat/p/2564324.html