• FreeSql学习笔记——4.联表


    前言

      上一章节是查询,记录了简单的查询,比较看好的是分块、Dto映射和分页,除了简单的单表查询,更多的时候要用到联表查询,毕竟设计数据库是按照范式设计,FreeSql的联表操作有导航属性、Join联表和Sql联表等。

    Init

      使用到联表,目前的Student表不够,新增一个Class表,同时新增Student表的ClassId字段和Class字段,数据库新增几条记录

    查看代码
    [Table(Name = "Student")]
    public class Student
    {
        [Column(IsIdentity = true, IsPrimary = true)]
        public long Id { get; set; }
    
        [Column(IsNullable = false, DbType = "varchar(20)")]
        public string Name { get; set; }
    
        public int Age { get; set; }
    
        public StatusEnum Status { get; set; }
    
        public DateTime AddTime { get; set; }
    
        [Column(IsNullable =true,DbType = "varchar(100)")]
        public string Remark { get; set; }
    
        public long ClassId { get; set; }
    
        public Class Class { get; set; }
    }
    
     public enum StatusEnum
     {
         Normal = 1,
    
         Freeze = 2
     }
     
    [Table(Name = "Class")]
    public class Class
    {
        [Column(IsIdentity = true, IsPrimary = true)]
        public long Id { get; set; }
    
        [Column(IsNullable = false, DbType = "varchar(20)")]
        public string Name { get; set; }
    
        public List<Student> StudentList { get; set; }
    }

    连表查询

      利用导航属性字段进行连表查询,写法和sql很相似
    _freeSql.Select<Student>()
                .InnerJoin(x => x.Class.Id == x.ClassId)
                .Where(x => x.Id > 10)
                .ToList();
    //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId], a__Class.[Id] as9, a__Class.[Name] as10
    //FROM[Student] a
    //INNER JOIN[Class] a__Class ON a__Class.[Id] = a.[ClassId]
    //WHERE(a.[Id] > 10)
    
      
      联表查询后也能指定返回的字段,与单表使用方式一样
    _freeSql.Select<Student, Class>()
                 .InnerJoin(x => x.t1.ClassId == x.t2.Id)
                 .Where(x => x.t1.Id > 10)
                 .ToList(x => new { Name=x.t1.Name, ClassName=x.t2.Name });
     //SELECT a.[Name] as1, b.[Name] as2
     //FROM[Student] a
     //INNER JOIN[Class] b ON a.[ClassId] = b.[Id]
     //WHERE(a.[Id] > 10)
     

    自定义查询

      自定义Sql查询,使用Linq+Sql进行联表查询,可以做到使用字符串去拼接sql语句,包括表、条件、查询的字段,非常灵活
    _freeSql.Select<Student>()
         .InnerJoin("Class b on b.Id = a.ClassId")
         .Where(x => x.Id > 10)
         .Where("b.Id>0")
         .ToList(x => new { Name = x.Name, ClassName = "b.Name" });
    //SELECT a.[Name] as1, b.Name as2 
    //FROM[Student] a
    //INNER JOIN Class b on b.Id = a.ClassId
    //WHERE(a.[Id] > 10) AND(b.Id > 0)

    子查询

    _freeSql.Select<Student>()
        .Where(a => _freeSql.Select<Class>().As("b").ToList(b => b.Id).Contains(a.ClassId))
        .ToList();
    //SELECT value from fn_listextendedproperty('MS_Description', 'schema', N'dbo', 'table', N'Class', NULL, NULL)
    //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
    //FROM[Student] a
    //WHERE(((a.[ClassId]) in (SELECT b.[Id]
    //FROM[Class] b)))
  • 相关阅读:
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1044:判断是否为两位数
    1043:整数大小比较
    1043:整数大小比较
    1043:整数大小比较
    排序算法 —— 插入排序
    排序算法 —— 插入排序
    排序算法 —— 插入排序
    C#中如何获取一个字体的宽度值(像素单位)
    visual studio 恢复默认界面
    visual studio 恢复默认界面
  • 原文地址:https://www.cnblogs.com/zousc/p/16304606.html
Copyright © 2020-2023  润新知