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 单例模式class Topic {
[Column(IsIdentity = true)] public int Id { get; set; } public string Title { get; set; } public int Clicks { get; set; } public DateTime CreateTime { get; set; } public int CategoryId { get; set; } public Category Category { get; set; }
}class Category {
[Column(IsIdentity = true)] public int Id { get; set; } public string Name { get; set; } public int ParentId { get; set; } public CategoryType Parent { get; set; } public List<Topic> Topics { get; set; }
}class CategoryType { public int Id { get; set; } public string Name { get; set; }
}
1、导航属性联表
fsql.Select<Topic>()
.LeftJoin(a => a.Category.Id == a.CategoryId)
.LeftJoin(a => a.Category.Parent.Id == a.Category.ParentId)
.Where(a => a.Category.Parent.Id > 0)
.ToList();//SELECT a.`Id`, a.`Title`, a.`Clicks`, a.`CreateTime`, a.`CategoryId`, a__Category.`Id` as6, a__Category.`Name`, a__Category.`ParentId`//FROM `Topic` a//LEFT JOIN `Category` a__Category ON a__Category.`Id` = a.`CategoryId`//LEFT JOIN `CategoryType` a__Category__Parent ON a__Category__Parent.`Id` = a__Category.`ParentId`
提示:正确配置导航关系后,不再需要手工调用 LeftJoin
2、复杂联表
fsql.Select<Topic, Category, CategoryType>()
.LeftJoin((a,b,c) => a.CategoryId == b.Id)
.LeftJoin((a,b,c) => b.ParentId == c.Id)
.Where((a,b,c) => c.Id > 0)
.ToList((a,b,c) => new { a,b,c });//或者
fsql.Select<Topic>().From<Category, CategoryType>((s, b, c) => s
.LeftJoin(a => a.CategoryId == b.Id)
.LeftJoin(a => b.ParentId == c.Id))
.Where((a,b,c) => c.Id > 0)
.ToList((a,b,c) => new { a,b,c });//SELECT ...//FROM `Topic` a//LEFT JOIN `Category` b ON a.`CategoryId` = b.`Id`//LEFT JOIN `CategoryType` c ON b.`ParentId` = c.`Id`//WHERE c. `Id` > 0
3、WithSql
fsql.Select<Topic, Category, CategoryType>()
.WithSql( "select * from Topic where id=@id1", "select * from Category where id=@id2", null, //不设置 CategoryType 对应的 SQL new { id1 = 10, id2 = 11, id3 = 13 }
)
.LeftJoin((a,b,c) => a.CategoryId == b.Id)
.LeftJoin((a,b,c) => b.ParentId == c.Id)
.ToList();//SELECT ...//FROM ( select * from Topic where id=@id1 ) a//LEFT JOIN ( select * from Category where id=@id2 ) b ON a.`CategoryId` = b.`Id`//LEFT JOIN `CategoryType` c ON b.`ParentId` = c.`Id`
4、SQL联表
fsql.Select<Topic>()
.LeftJoin("Category b on b.Id = a.CategoryId and b.Name = @bname", new { bname = "xxx" })
.ToList();//SELECT a.`Id`, a.`Title`, a.`Clicks`, a.`CreateTime`, a.`CategoryId`//FROM `Topic` a//LEFT JOIN Category b on b.Id = a.CategoryId and b.Name = @bname
延伸问题:SQL联表 b 表的字段如何在 ToList 中指定?
.ToList(a => new
{
bid = Convert.ToInt32("b.Id"),
bName = "b.Name"
})