类别:学习文档

日期:2021-07-15 浏览:2315 评论:0

FreeSql 采用 ExpressionTree 优化读取速读,如果懂技术的你一定知道 .NETCore 技术下除了原生代码,最快就是 Emit 和 ExpressionTree。项目在初期使用的反射+缓存,虽然 .NETCore 优化了反射性能,但经过与Dapper性能测试对比之后,发现仍然有一定差距,改成 ExpresstionTree 后才与 Dapper 性能相当。FreeSql 支持的类型较多,实现 ExpressionTree 的复杂度较大,有兴趣的朋友可以翻阅源代码。

1、返回单条记录

Topic t1 = fsql.Select<Topic>().ToOne();

FreeSql 有一个约定,ToOne 永远返回 null 或 有数据的实体对象,ToList 永远返回非 null 的 List<实体类型>

2、返回 List

List<Topic> t1 = fsql.Select<Topic>().ToList();

3、返回 TreeList

List<Category> t2 = fsql.Select<Category>.ToTreeList();
List<Category> t3 = fsql.Select<Category>.Where(a => a.Name = "家电").AsTreeCte().ToTreeList();//v1.6.0 AsTreeCte() 递归CTE查询 家电 下的所有子分类

查询数据加工为树型,注意:实体需要配置父子导航属性

4、返回 List + 导航属性的数据

List<Topic> t4 = fsql.Select<Topic>().LeftJoin(a => a.Type.Id == a.TypeId).ToList();//此时会返回普通字段 + 导航对象 Type 的数据

5、指定字段返回

//返回一个字段
List<int> t5 = fsql.Select<Topic>().ToList(a => a.Id);

//返回匿名类
List<匿名类> t6 = fsql.Select<Topic>().ToList(a => new { a.Id, a.Title });

//返回元组
List<(int, string)> t7 = fsql.Select<Topic>().ToList<(int, string)>("id, title");

//返回SQL字段
List<匿名类> t8 = fsql.Select<Topic>().ToList(a => new {
    a.Id,
    a.Title,
    a.Type, //可以直接返回导航属性 Type
    cstitle = "substr(a.title, 0, 2)", //将 substr(a.title, 0, 2) 作为查询字段
    csnow = Convert.ToDateTime("now()"), //将 now() 作为查询字段
    //奇思妙想:怎么查询开窗函数的结果
});
    
//返回子查询的字段
List<匿名类> t9 = fsql.Select<Topic>().ToList(a => new {
    a.Id,
    count = fsql.Select<T2>().Count(),
    max = fsql.Select<T2>().Max(b => b.Id),
    min = fsql.Select<T2>().Min(b => b.Id),
    name = fsql.Select<2>().First(b => b.name)
});

6、忽略字段返回

参考实现:https://github.com/dotnetcore/FreeSql/issues/528

7、执行SQL

class xxx {
    public int Id { get; set; }    
    public string Path { get; set; }    
    public string Title2 { get; set; }
}

List<xxx> t10 = fsql.Ado.Query<xxx>("select * from song");
List<(int, string ,string)> t11 = fsql.Ado.Query<(int, string, string)>("select * from song");
List<dynamic> t12 = fsql.Ado.Query<dynamic>("select * from song");

注意:Ado.Query 的实体特性是无效的,比如 [Column(Name = "xxx")] 无效

8、WithSql

fsql.Select<Topic>()
  .WithSql("select * from Topic where clicks > 10")
  .Page(1, 10)
  .ToList()
  //SELECT a.`Id`, a.`Clicks`, a.`CategoryId`, a.`Title`, a.`CreateTime` 
  //FROM (select * from Topic where clicks > 10) a

WithSql 使用多次为 UNION ALL 查询

9、ToChunk

执行查询,分块返回数据,可减少内存开销。比如读取10万条数据,每次返回100条处理。

var testlist1 = fsql.Select<Song>().OrderBy(a => a.Id).ToList();var testlist2 = new List<Song>();
fsql.Select<Song>().OrderBy(a => a.Id).ToChunk(100, list =>
{
    testlist2.AddRange(list);
});
//这里示范,最终 testlist1 与 testlist2 返回的数据相同。

API

方法返回值参数描述
ToSqlstring
返回即将执行的SQL语句
ToListList
执行SQL查询,返回 T1 实体所有字段的记录,若存在导航属性则一起查询返回,记录不存在时返回 Count 为 0 的列表
ToList<Dto>List<Dto>Lambda执行SQL查询,返回指定字段或Dto映射的记录,记录不存在时返回 Count 为 0 的列表
ToList<T>List<T>string field执行SQL查询,返回 field 指定字段的记录,并以元组或基础类型(int,string,long)接收,记录不存在时返回 Count 为 0 的列表
ToOneT1
执行SQL查询,返回 T1 实体所有字段的第一条记录,记录不存在时返回 null
ToChunk<空>int size, Action<List<T1>> done执行SQL查询,分块返回数据,可减少内存开销。比如读取10万条数据,每次返回100条处理。
Anybool
执行SQL查询,是否有记录
SumTLambda指定一个列求和
MinTLambda指定一个列求最小值
MaxTLambda指定一个列求最大值
AvgTLambda指定一个列求平均值

系列文章导航

FreeSql (一)入门及安装 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二)自动迁移实体 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三)实体特性 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (四)实体特性 Fluent Api - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (五)插入数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (六)批量插入数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (七)插入数据时忽略列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (八)插入数据时指定列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (九)删除数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十)更新数据 - 学习文档 - 零一的世界 (vtzw.com)FreeSql (十一)更新数据 Where - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十二)更新数据时指定列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十三)更新数据时忽略列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十四)批量更新数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十五)查询数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十六)分页查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十七)联表查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十八)导航属性 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十九)多表查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十)多表查询 WhereCascade - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十一)查询返回数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十二)Dto 映射查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十三)分组、聚合 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十四)Linq To Sql 语法使用介绍 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十五)延时加载 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十六)贪婪加载 Include、IncludeMany - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十八)事务 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十九)Lambda 表达式 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十)读写分离 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十一)分表分库 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十二)Aop - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十三)CodeFirst 类型映射 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十四)CodeFirst 迁移说明 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十五)CodeFirst 自定义特性 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十六)进阶 仓储系列文档 - 学习文档 - 零一的世界 (vtzw.com)


本文标题:FreeSql (二十一)查询返回数据
本文链接:https://vtzw.com/post/719.html
作者授权:除特别说明外,本文由 零一 原创编译并授权 零一的世界 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
 您阅读本篇文章共花了: 

 可能感兴趣的文章

评论区

发表评论 / 取消回复

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。

最新留言