LINQ连接查询

用LINQ进行连接查询,感觉挺别扭,还是用SQL比较舒服,故记录一下,以备后用。

先把数据列出来

    class Pet
    {
        public string PetName { get; set; }
        public string OwnerName { get; set; }
    }

    class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
 List<Person> persons = new List<Person>()
        {
            new Person(){FirstName="Zhang",LastName="San"},
            new Person(){FirstName="Li",LastName="Si"},
            new Person(){FirstName="Wang",LastName="Wu"},
            new Person(){FirstName="Zhao",LastName="Liu"}
            
        };

        List<Pet> pets = new List<Pet>() 
        { 
            new Pet(){PetName="Cat",OwnerName="Zhang"},
            new Pet(){PetName="Dog",OwnerName="Si"},
            new Pet(){PetName="Monkey",OwnerName="Wang"},
            new Pet(){PetName="Panda",OwnerName="Liu"},
            new Pet(){PetName="King Kong"}
        };

 

来一个最简单的做链接查询与右连接查询:

 左连接

var p = from person in persons
                    join pet in pets
                    on person.FirstName equals pet.OwnerName into petsOrEmpty
                    from pet in petsOrEmpty.DefaultIfEmpty()
                    select new
                    {
                        FirstName = person.FirstName,
                        LastName = person.LastName,
                        PetName = pet == null ? string.Empty : pet.PetName

                    };
            foreach (var i in p)
                Console.WriteLine("{0} {1}:{2}", i.FirstName, i.LastName, i.PetName);

            //结果为:
            //Zhang San:Cat
            //Li Si:
            //Wang Wu:Monkey
            //Zhao Liu:

右连接

var p = from pet in pets
                    join person in persons
                    on pet.OwnerName equals person.FirstName into perdonsOrEmpty
                    from person in perdonsOrEmpty.DefaultIfEmpty()
                    select new
                    {
                        FirstName = person == null ? string.Empty : person.FirstName,
                        LastName = person == null ? string.Empty : person.LastName,
                        PetName = pet.PetName

                    };

            foreach (var i in p)
                Console.WriteLine("{0} {1}:{2}", i.FirstName, i.LastName, i.PetName);

            //结果为:
            //Zhang San:Cat
            // :Dog
            //Wang Wu:Monkey
            // :Panda
            // :King Kong

下面列举的连接条件不是一个单纯的相等条件,会带有AND 和 OR

带AND的连接

var p = from person in persons
                    join pet in pets
                    on new { FirstName = person.FirstName, LastName = person.LastName } equals 
              new { FirstName = pet.OwnerName, LastName = pet.OwnerName } into petsOrEmpty from pet in petsOrEmpty.DefaultIfEmpty() select new { FirstName = person.FirstName, LastName = person.LastName, PetName = pet == null ? string.Empty : pet.PetName }; foreach (var i in p) Console.WriteLine("{0} {1}:{2}", i.FirstName, i.LastName, i.PetName); //结果为: //Zhang San: //Li Si: //Wang Wu: //Zhao Liu:

下面这个例子个人觉得不是没用到连接,但也能达到连接的效果,若有哪位大师知道真正带OR的连接查询,请指点

var p = from person in persons
                    from pet in pets
                    .Where(inner => person.LastName == inner.OwnerName ||
                 person.FirstName == inner.OwnerName).DefaultIfEmpty() select new { FirstName = person.FirstName, LastName = person.LastName, PetName = pet.PetName }; foreach (var i in p) Console.WriteLine("{0} {1}:{2}", i.FirstName, i.LastName, i.PetName); //结果为: //Zhang San:Cat //Li Si:Dog //Wang Wu:Monkey //Zhao Liu:Panda

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值