LINQ 基本子句之二 join

Join子句据说可以实现3中连接关系。

1.内部连接——元素的连接关系必须同时满足被连接的两个数据源

2.分组连接

3.左外连接

1.最基本的,内部连接,类似于sql中inner join。

由于student类和phone类只有一个匹配的连接,因此,只返回一个id,1.

 public class student
     {
     public   int id;
        string name;
        public student(int id, string name)
        {
            this.id = id;
            this.name = name;
        }
     }
     public class phone
     {
      public   int id;
         string number;
         public phone(int i, string number)
         {
             this.id = i;
             this.number = number;
         }

     }

    class Program
    {
        static void Main(string[] args)
        {
          List<student> stu=new List<student>();
          List<phone> ph=new List<phone>();
          student st1=new student (1,"bob");
          student st2 = new student(2, "tony");
          phone p1 = new phone(1, "2333333");
            stu.Add(st1);
            stu.Add(st2);
            ph.Add(p1);
            var result = from x in ph
                               join s in stu on x.id equals s.id
                              select x;
            foreach(var r in result)
            Console.WriteLine(r.id);
            Console.ReadLine();
        }
    }

2.分组连接 类似于full join

注意其中ToList的用法。我还不很明白,Mark之。

     public class student
     {
       public   int id;
       public    string name;
        public student(int id, string name)
        {
            this.id = id;
            this.name = name;
        }
     }
     public class phone
     {
        public   int id;
        public string number;
         public phone(int i, string number)
         {
             this.id = i;
             this.number = number;
         }

     }

    class Program
    {
        static void Main(string[] args)
        {
          List<student> stu=new List<student>();
          List<phone> ph=new List<phone>();
          student st1=new student (1,"bob");
          student st2 = new student(2, "tony");
          phone p1 = new phone(1, "2333333");
            stu.Add(st1);
            stu.Add(st2);
            ph.Add(p1);
            var result = from s in stu
                         join p in ph on s.id equals p.id into g
                         select new
                         {
                             id = s.id,
                             name = s.name,
                             phone = g.ToList()
                         };
            foreach (var r in result)
            {
                Console.WriteLine(r.id);
                Console.WriteLine(r.name);
                if (r.phone.Count > 0)
                    Console.WriteLine(r.phone[0].number);
                else
                    Console.WriteLine("xxxx");
            }
            Console.ReadLine();
        }
    }

结果如图

3.类似Left join,往往与DefaultIfEmpty()结合使用,若第一个集合中的元素没有找到相关元素,DefaultIfEmpty()可以指定该元素的相关元素的默认元素。

讲phone作为第一个元素

  class Program
    {
        static void Main(string[] args)
        {
          List<student> stu=new List<student>();
          List<phone> ph=new List<phone>();
          student st1=new student (1,"bob");
          student st2 = new student(2, "tony");
          phone p1 = new phone(1, "2333333");
            stu.Add(st1);
            stu.Add(st2);
            ph.Add(p1);
            var result = from p in ph
                         join s in stu on p.id equals s.id into g
                         from pc in g.DefaultIfEmpty()
                         select new
                         {
                             id = p.id,
                             num = p.number,
                             name = g.ToList()
                         };
            foreach (var r in result)
            {
                Console.WriteLine(r.id);
                Console.WriteLine(r.num);
                if (r.name.Count > 0)
                    Console.WriteLine(r.name[0].name);
                else
                    Console.WriteLine("xxxx");
            }
            Console.ReadLine();
        }

结果如图

通常,若要生成两个集合的左外部连接,可以分两步实现,

其一,使用分组连接执行内部连接。

其二,对分组连接中每个匹配元素序列调用DefaultIfEmpty().

LINQ 基本子句之二 join,布布扣,bubuko.com

时间: 2024-08-25 08:37:15

LINQ 基本子句之二 join的相关文章

LINQ TO SQL 中的join(转帖)

http://www.cnblogs.com/ASPNET2008/archive/2008/12/21/1358152.html join对于喜欢写SQL的朋友来说还是比较实用,也比较容易接受的东西.在LINQ TO SQL中,写多表查询,同样可以写join,只是它有它自己的语法要求而已,语义都是一样的,下面我来讲下LINQ TO SQL中的join最基本的形式:都是最简单的,当然还有其它方面的内容,如:怎样加上过滤条件,如何分组,如何排序等等,为了单纯说join的用法,这里就简化下. Cod

Linq To SQL LEFT OUTER JOIN (Left Join)

SQL: SELECT [t0].[ProductName], [t1].[TotalPrice] AS [TotalPrice] FROM [Product] AS [t0] LEFT OUTER JOIN [OrderDetail] AS [t1] ON [t0].[ProductID] = [t1].[ProductID] Linq Query: from p in Products join od in OrderDetails on p.ProductID equals od.Prod

Linq表连接大全(INNER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN、CROSS JOIN)

转载http://www.cnblogs.com/shenqiboy/p/3260105.html 我们知道在SQL中一共有五种JOIN操作:INNER JOIN.LEFT OUTER JOIN.RIGHT OUTER JOIN.FULL OUTER JOIN.CROSS JOIN        内连接.Sql: SELECT [t0].[GroupName], [t1].[UserName] FROM [Group] AS [t0] INNER JOIN [User] AS [t1] ON (

LinQ实战学习笔记(二) C#增强特性

C# 为支持LINQ添加了许多语言特性: 隐式类型局部变量 对象初始化器 Lambda表达式 扩展方法 匿名类型 了解这些新特性是全面了解LINQ的重要先解条件,因此请不要忽视它们. (一)  隐式类型局部变量 processData这个类中的亮点是 {get;set;} 它是一个新特性, 系统会自动产生一个匿名私有变量. 1 public Int32 Id { get; set; } 2 public Int64 Memory { get; set; } 3 public string Nam

Linq to sql之left join运用示例

示例一: var l= from a in cardsBll.GetCards() join b in usersBll.GetAllUsers() on a.CardSn equals b.CardSn into temp where a.CardSn.Contains(key) from t in temp.DefaultIfEmpty() select new CardsAndUsersView { Card_Id = a.Id, CardPw = a.CardPw, Expries =

24.C#LINQ TO XML(十二章12.3)

自己也写了那么多,但还有很多不懂,有点浮躁吧,但饭还是要吃啊,说说LINQ TO XML吧. LINQ TO XML位于System.Xml.Linq程序集,并且大多数类型位于System.Xml.Linq命名空间.该命名空间下几乎所有类型都以X为前缀;普通DOM API中的Element对应LINQ TO XML中的XElement.列举下都有哪些类型. XName:表示元素和特性的名称 XNamespace:表示XML的命名空间,通常是一个URL XObject:是XNode和XAttrib

LINQ 学习路程 -- 查询操作 Join

Join操作是将两个集合联合 Joining Operators Usage Join 将两个序列连接并返回结果集 GroupJoin 根据key将两个序列连接返回,像是SQL中的Left Join Join操作两个集合,inner collection 和 outer collection 它返回一个集合(包含两个集合根据特定条件结合的所有元素),和SQL中的inner join一样 public static IEnumerable<TResult> Join<TOuter, TIn

Linq 多连接及 left join 实例 记录

var retList = from d in mbExList.Cast<MaterialBaseEx>().ToList() join c in umcList.Cast<ClassifyBaseEx>().ToList() on d.ClsCode equals c.ClsCode join b in collectItem.Cast<CollectItem>().ToList() on d.Guid equals b.MatID into temp join e

C# LINQ 详解 From Where Select Group Into OrderBy Let Join

目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 LINQ的全称是Language Integrated Query,中文译成"语言集成查询".LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了三大组件来实现这个封装,分别是LINQ to Object.LINQ to ADO.NET.LINQ to XML.它们和.NET