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); //} } }