.NETdotNET

FreeSql 教程 (十七)联表查询

2020-03-14  本文已影响0人  叶先生_34e6

FreeSql 以 MIT 开源协议托管于 github:https://github.com/2881099/FreeSql

FreeSql在查询数据下足了功能,链式查询语法、多表查询、表达式函数支持得非常到位。

static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
    .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
    .Build(); //请务必定义成 Singleton 单例模式

[Table(Name = "tb_topic")]
class Topic {
    [Column(IsIdentity = true, IsPrimary = true)]
    public int Id { get; set; }
    public int Clicks { get; set; }
    public int TestTypeInfoGuid { get; set; }
    public TestTypeInfo Type { get; set; }
    public string Title { get; set; }
    public DateTime CreateTime { get; set; }
}
class TestTypeInfo {
    public int Guid { get; set; }
    public int ParentId { get; set; }
    public TestTypeParentInfo Parent { get; set; }
    public string Name { get; set; }
    public List<Topic> Topics { get; set; }
}
class TestTypeParentInfo {
    public int Id { get; set; }
    public string Name { get; set; }
}

1、导航属性联表

sql = fsql.Select<Topic>()
  .LeftJoin(a => a.Type.Guid == a.TestTypeInfoGuid)
  .LeftJoin(a => a.Type.Parent.Id == a.Type.ParentId)
  .ToSql();
//SELECT a.`Id`, a.`Clicks`, a.`TestTypeInfoGuid`, a__Type.`Guid`, a__Type.`ParentId`, a__Type.`Name`, a.`Title`, a.`CreateTime` 
//FROM `tb_topic` a 
//LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TestTypeInfoGuid` 
//LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId`

提示:正确配置导航关系后,不再需要手工调用 LeftJoin

2、普通联表

sql = fsql.Select<Topic>()
  .LeftJoin<TestTypeInfo>((a, b) => b.Guid == a.TestTypeInfoGuid)
  .ToSql();
//SELECT a.`Id`, a.`Clicks`, a.`TestTypeInfoGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` 
//FROM `tb_topic` a 
//LEFT JOIN `TestTypeInfo` b ON b.`Guid` = a.`TestTypeInfoGuid`

3、复杂联表

sql = fsql.Select<Topic>().From<TestTypeInfo, TestTypeParentInfo>((s, b, c) => s
  .LeftJoin(a => a.TestTypeInfoGuid == b.Guid)
  .LeftJoin(a => b.ParentId == c.Id))
  .ToSql();

//或者
sql = fsql.Select<Topic, TestTypeInfo, TestTypeParentInfo>()
  .LeftJoin((a,b,c) => a.TestTypeInfoGuid == b.Guid)
  .LeftJoin((a,b,c) => b.ParentId == c.id)
  .ToSql();
//SELECT a.`Id`, a.`Clicks`, a.`TestTypeInfoGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` 
//FROM `tb_topic` a 
//LEFT JOIN `TestTypeInfo` b ON a.`TestTypeInfoGuid` = b.`Guid` 
//LEFT JOIN `TestTypeParentInfo` c ON b.`ParentId` = c.`Id`

4、SQL联表

sql = fsql.Select<Topic>()
  .LeftJoin("TestTypeInfo b on b.Guid = a.TestTypeInfoGuid and b.Name = ?bname", new { bname = "xxx" })
  .ToSql();
//SELECT a.`Id`, a.`Clicks`, a.`TestTypeInfoGuid`, a.`Title`, a.`CreateTime` 
//FROM `tb_topic` a 
//LEFT JOIN TestTypeInfo b on b.Guid = a.TestTypeInfoGuid and b.Name = ?bname

系列文章导航

上一篇 下一篇

猜你喜欢

热点阅读