• LINQ查询表达式---------join子句


    LINQ查询表达式---------join子句

    join 子句接受两个源序列作为输入。 每个序列中的元素都必须是可以与另一个序列中的相应属性进行比较的属性,或者包含一个这样的属性。 join子句使用特殊的 equals 关键字比较指定的键是否相等。 join 子句执行的所有联接都是同等联接。 join 子句的输出形式取决于所执行的联接的具体类型。 以下是三种最常见的联接类型:

    内部联接

    分组联接

    左外部联接

    class Program
    {
        public class PerInfo
        {
            public int Id
            {
                get;
                set;
            }
            public string Name
            {
                get;
                set;
            }
            public int Age
            {
                get;
                set;
            }
        }
    
        public class CustInfo
        {
            public int PerId
            {
                get;
                set;
            }
            public string Tel
            {
                get;
                set;
            }
            public string Email
            {
                get;
                set;
            }
        }
    
        static void Main(string[] args)
        {
            List<PerInfo> perinfos = new List<PerInfo>
            {
                new PerInfo{Id = 1, Name = "小白", Age = 15},
                new PerInfo{Id = 2, Name = "小日", Age = 17},
                new PerInfo{Id = 3, Name = "小月", Age = 18},
                new PerInfo{Id = 4, Name = "小明", Age = 22}
            };
    
            List<CustInfo> custInfos = new List<CustInfo>
            {
                new CustInfo{PerId = 1, Tel = "153******", Email = "123@qq.com"},
                new CustInfo{PerId = 1, Tel = "153****11", Email = "321@qq.com"},
                new CustInfo{PerId = 2, Tel = "134******", Email = "112@qq.com"},
                new CustInfo{PerId = 2, Tel = "134****11", Email = "211@qq.com"},
                new CustInfo{PerId = 4, Tel = "125******", Email = "134@qq.com"},
                new CustInfo{PerId = 4, Tel = "125****11", Email = "431@qq.com"}
            };
    
            //1、内部联接
            var query1 = from p in perinfos
                         join c in custInfos on p.Id equals c.PerId
                         select new { NewName = p.Name, NewTel = c.Tel, NewEmail = c.Email };
            Console.WriteLine("内部联接:");
            foreach (var item in query1)
            {
                Console.WriteLine("  {0}   {1}   {2}", item.NewName, item.NewTel, item.NewEmail);
            }
    
            //2、分组联接_01
            var query2 = from p in perinfos
                         join c in custInfos on p.Id equals c.PerId into groupquery
                         select new { NewName = p.Name, NewQuery = groupquery };
            Console.WriteLine("
    分组联接_01");
            foreach (var v in query2)
            {
                Console.WriteLine("{0}", v.NewName);
                foreach (var item in v.NewQuery)
                {
                    Console.WriteLine("   {0}   {1}", item.Tel, item.Email);
                }
            }
    
            //3、分组联接_02
            var query3 = from p in perinfos
                         join c in custInfos on p.Id equals c.PerId into groupquery
                         select groupquery;
            Console.WriteLine("
    分组联接_02");
            foreach (var v in query3)
            {
                foreach (var item in v)
                {
                    Console.WriteLine("  {0}   {1}   {2}", item.PerId, item.Tel, item.Email);
                }
            }
    
            //4、分组联接_03
            var query4 = from p in perinfos
                         join c in custInfos on p.Id equals c.PerId into groupquery
                         select new
                         {
                            NewName = p.Name,
                            NewQuery = from q in groupquery
                            where q.PerId > 1
                            orderby q.Email descending
                            select q
                         };
            Console.WriteLine("
    分组联接_03");
            foreach (var v in query4)
            {
                Console.WriteLine("{0}", v.NewName);
                foreach (var item in v.NewQuery)
                {
                    Console.WriteLine("  {0}   {1}   {2}", item.PerId, item.Tel, item.Email);
                }
            }
    
            //5、左外联接_01
            var query5 = from p in perinfos
                         join c in custInfos on p.Id equals c.PerId into groupquery
                         select groupquery.DefaultIfEmpty(new CustInfo()
                         {
                            PerId = p.Id, Tel = "Nothing", Email = "Nothing"
                         });
            Console.WriteLine("
    左外联接_01");
            foreach (var v in query5)
            {
                foreach (var item in v)
                {
                    Console.WriteLine("  {0}   {1}   {2}", item.PerId, item.Tel, item.Email);
                }
            }
    
            // 6、左外联接_02
            var query6 = from p in perinfos
                         join c in custInfos on p.Id equals c.PerId into groupquery
                         from item in groupquery.DefaultIfEmpty()
                         select new { Email = item == null ? "Nothing!" : item.Email, ID = p.Id };
    
            Console.WriteLine("
    左外联接_02");
            foreach (var v in query6)
            {
    
                Console.WriteLine("  {0}   {1}  ", v.ID, v.Email);
    
            }
    
            Console.ReadLine();
        }
    }
    输出结果:
    内部联接:
      小白   153******   123@qq.com
      小白   153****11   321@qq.com
      小日   134******   112@qq.com
      小日   134****11   211@qq.com
      小明   125******   134@qq.com
      小明   125****11   431@qq.com
    
    分组联接_01
    小白
       153******   123@qq.com
       153****11   321@qq.com
    小日
       134******   112@qq.com
       134****11   211@qq.com
    小月
    小明
       125******   134@qq.com
       125****11   431@qq.com
    
    分组联接_02
      1   153******   123@qq.com
      1   153****11   321@qq.com
      2   134******   112@qq.com
      2   134****11   211@qq.com
      4   125******   134@qq.com
      4   125****11   431@qq.com
    
    分组联接_03
    小白
    小日
      2   134****11   211@qq.com
      2   134******   112@qq.com
    小月
    小明
      4   125****11   431@qq.com
      4   125******   134@qq.com
    
    左外联接_01
      1   153******   123@qq.com
      1   153****11   321@qq.com
      2   134******   112@qq.com
      2   134****11   211@qq.com
      3   Nothing   Nothing
      4   125******   134@qq.com
      4   125****11   431@qq.com
    
    左外联接_02
      1   123@qq.com
      1   321@qq.com
      2   112@qq.com
      2   211@qq.com
      3   Nothing!
      4   134@qq.com
      4   431@qq.com
    

      

  • 相关阅读:
    web前端学习(四)JavaScript学习笔记部分(8)-- JavaScript瀑布流
    localStorage对象简单应用
    html文档加载顺序简单理解
    回调函数理解(转载)
    web前端学习(四)JavaScript学习笔记部分(8)-- JavaScript 浏览器对象
    web前端学习(四)JavaScript学习笔记部分(7)-- JavaScript DOM对象控制HTML元素详解
    JS random函数深入理解(转载)
    web前端学习(四)JavaScript学习笔记部分(6)-- js内置对象
    下雪了-js下雪效果
    LESS笔记
  • 原文地址:https://www.cnblogs.com/haibing0107/p/6513637.html
Copyright © 2020-2023  润新知