FreeSql (二十一)查詢返回數據


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、執行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")] 無效

7、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 查詢

8、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

方法 返回值 參數 描述
ToSql string 返回即將執行的SQL語句
ToList List 執行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 的列表
ToOne T1 執行SQL查詢,返回 T1 實體所有字段的第一條記錄,記錄不存在時返回 null
ToChunk <空> int size, Action<List<T1>> done 執行SQL查詢,分塊返回數據,可減少內存開銷。比如讀取10萬條數據,每次返回100條處理。
Any bool 執行SQL查詢,是否有記錄
Sum T Lambda 指定一個列求和
Min T Lambda 指定一個列求最小值
Max T Lambda 指定一個列求最大值
Avg T Lambda 指定一個列求平均值

系列文章導航


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM