zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    航班延误来领钱,信用卡航班延误险最全攻略(2018年版)
    各银行信用卡延误险整理
    酒店web认证802.11x+ROS共享NAT上网
    登机牌,机票,行程单的区别
    ros6.0的包转发图解
    一将成,万骨枯,趣店上市背后的残酷游戏
    异常值检验实战1--风控贷款年龄变量(附python代码)
    outlier异常值检验算法之_箱型图(附python代码)
    sklearn11_函数汇总
    python高级数据可视化Dash2
  • 原文地址:https://www.cnblogs.com/haibing0107/p/6513637.html
Copyright © 2011-2022 走看看