之前lambda用的不多,但是lambda表达式确实很好用,今天写了个示例,简单的用一下Join。
新建三个类,User和Phone还有一个查询的结果UserDto
class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
}
class Phone
{
public int UserId { get; set; }
public string PhoneNumber { get; set; }
public Type? Type;
}
class UserDto
{
public string Name { get; set; }
public string Gender { get; set; }
public string PhoneNumber { get; set; }
public string PhoneType { get; set; }
public override string ToString()
{
return string.Format("Name={0},Gender={1},PhoneNumber={2},PhoneType={3}", Name, Gender, PhoneNumber, PhoneType);
}
}
还有一个枚举
enum Type
{
联通=1,
移动=2,
电信=3
}
然后是需要初始化一些值。
List<User> users = new List<User>() {
new User{Id=1, Name="张三", Gender="男" },
new User{Id=2, Name="李四",Gender="男"},
new User{Id=3, Name="王五",Gender="男" },
new User{Id=4, Name="赵柳",Gender="女" },
new User{Id=5, Name="钱七",Gender="男" }
};
List<Phone> phones = new List<Phone>() {
new Phone{ UserId=1, PhoneNumber="13000000000", Type=Type.电信 },
new Phone{ UserId=2, PhoneNumber="13000000001", Type=Type.联通 },
new Phone{ UserId=3, PhoneNumber="13000000002", Type=Type.移动 },
new Phone{ UserId=4, PhoneNumber="13000000003", Type=Type.电信 },
};
好了,准备工作做好了,接下来lambda就该登场了,由于类属性比较简单,所以查询也比较简单,具体的使用还要结合具体的业务场景。
Question one:查询用联通用户的姓名,性别,手机号,电话类型
//查询用联通手机号的用户的姓名,性别,手机号,电话类型
var userdto = users.Join(phones, t => t.Id, p => p.UserId, (t, p) => new UserDto {
Name = t.Name,
Gender = t.Gender,
PhoneNumber = p.PhoneNumber,
PhoneType = p.Type.ToString()
}).Where(t => t.PhoneType == "联通");
简单说一下Join,Join的前三个参数分别表示,需要连接的另一个数据集,以及两个表相互关联的属性,我这里明显User下的Id
和Phone下的UserId
是对应的,类型一定要是一样的,不然会报编译错误。这里相当于是把两个数据集按照Id
和UserId
的对应关系放到UserDto中,然后在UserDto中进行查询。
Question two:查询张三的姓名,性别,手机号,电话类型
//查询张三的姓名,性别,手机号,电话类型
var userdto1 = users.Where(t=>t.Name=="张三").Join(phones, t => t.Id, p => p.UserId, (t, p) => new UserDto
{
Name = t.Name,
Gender = t.Gender,
PhoneNumber = p.PhoneNumber,
PhoneType = p.Type.ToString()
});
先查询User然后连接Phone。
这里只是一点简单的使用,熟悉下Join以及lambda表达式的用法。
完整代码如下,可以新建个控制台应用程序,直接粘过去就行。
using System;
using System.Collections.Generic;
using System.Linq;
namespace lambda多表联合查询
{
class Program
{
static void Main(string[] args)
{
List<User> users = new List<User>() {
new User{Id=1, Name="张三", Gender="男" },
new User{Id=2, Name="李四",Gender="男"},
new User{Id=3, Name="王五",Gender="男" },
new User{Id=4, Name="赵柳",Gender="女" },
new User{Id=5, Name="钱七",Gender="男" }
};
List<Phone> phones = new List<Phone>() {
new Phone{ UserId=1, PhoneNumber="13000000000", Type=Type.电信 },
new Phone{ UserId=2, PhoneNumber="13000000001", Type=Type.联通 },
new Phone{ UserId=3, PhoneNumber="13000000002", Type=Type.移动 },
new Phone{ UserId=4, PhoneNumber="13000000003", Type=Type.电信 },
};
//查询用联通手机号的用户的姓名,性别,手机号,电话类型
var userdto = users.Join(phones, t => t.Id, p => p.UserId, (t, p) => new UserDto {
Name = t.Name,
Gender = t.Gender,
PhoneNumber = p.PhoneNumber,
PhoneType = p.Type.ToString()
}).Where(t => t.PhoneType == "联通");
//查询张三的姓名,性别,手机号,电话类型
var userdto1 = users.Where(t=>t.Name=="张三").Join(phones, t => t.Id, p => p.UserId, (t, p) => new UserDto
{
Name = t.Name,
Gender = t.Gender,
PhoneNumber = p.PhoneNumber,
PhoneType = p.Type.ToString()
});
foreach (var item in userdto)
{
Console.WriteLine(item.ToString());
}
Console.ReadKey();
}
}
class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
}
class Phone
{
public int UserId { get; set; }
public string PhoneNumber { get; set; }
public Type? Type;
}
enum Type
{
联通=1,
移动=2,
电信=3
}
class UserDto
{
public string Name { get; set; }
public string Gender { get; set; }
public string PhoneNumber { get; set; }
public string PhoneType { get; set; }
public override string ToString()
{
return string.Format("Name={0},Gender={1},PhoneNumber={2},PhoneType={3}", Name, Gender, PhoneNumber, PhoneType);
}
}
}
网友评论