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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步