lambda多表联合查询

2020-03-17  本文已影响0人  十柒年

之前lambda用的不多,但是lambda表达式确实很好用,今天写了个示例,简单的用一下Join。
新建三个类,UserPhone还有一个查询的结果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下的IdPhone下的UserId是对应的,类型一定要是一样的,不然会报编译错误。这里相当于是把两个数据集按照IdUserId的对应关系放到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);
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读