SqlSugar的Select用法

Select 位置

正常情況:應該在最後面, 一般是 .Where(..).OrderBy(..).Select(..).ToList()

特殊情況:如果Select不是最後一個位置,則Select要加MergeTable()合併成一個表, Select(...).MergeTable().Where

語法糖:

Select(...).MergeTable() 在新版本中可以用SelectMergeTable(it=>new xxx(){xx}).Where

 

返回一個字段和多個字段

List<int> listInt=db.Queryable<Student>().Select(it => it.Id).ToList();//返回一個字段
DataTable list=db.Queryable<Student>().Select(it => new { id=it.Id,name=it.Name}).ToDataTable();//2個字段 
List<Class1>list=db.Queryable<Student>().Select(it => new Class1{id=it.Id,name=it.Name}).ToList();//2個字段 
List<dynamic>list=db.Queryable<Student>().Select(it =>(dynamic)new{id=it.Id,name=it.Name}).ToList();//2個字段 
 
//動態 
List<int> listInt=db.Queryable<Student>().Select<int>("id").ToList();
List<Order> listInt=db.Queryable<Student>().Select<ViewModel>("id as id, name as name").ToList();

 

單表返回DTO

//返回匿名對象
var dynamic = db.Queryable<Student>().Select<dynamic>().ToList();
//Select * from Student
 
//手動:返回匿名集合 支持跨程序集
List<dynamic> dynamicList = db.Queryable<Student>().Select(it=>(dynamic)new { id=it.id}).ToList();
//Select id as id from Student Select只有一列所以只查一列
 
//手動:返回匿名集合  不能跨程序集用
var dynamic = db.Queryable<Student>().Select(it=> new { id=it.id}).ToList(); 
 
//手動:返回類集合-手動
List<Student> list= db.Queryable<Student>().Select(it=>new  Student{ id=it.id}).ToList();
//Select id as id from Student Select只有一列所以只查一列
 
//自動返回DTO集合: 請升級 5.1.3.2 
var listDto= db.Queryable<Student>().Select<StudentDto>().ToList();//返回List
 
//自動返回DTO : 請升級 5.1.3.35  
var listDto= db.Queryable<Student>()
            .Select(it=>new StudentDto()
             {
                  Count=100 //手動指定一列在自動映射
             },
             true)//true表式開啓自動映射
            .ToList();//返回List

 

多表返回DTO

手動DTO

var newClass= db.Queryable<Student, School, DataTestInfo>((st, sc, di) => new JoinQueryInfos(
    JoinType.Left, st.SchoolId == sc.Id,
    JoinType.Left, st.Name == di.String
)) 
.Select((st,sc,di)=>new ClassName{ name=st.Name,scid=sc.Id })//看這一行就行了
.ToList();//實體轉換
 
//指定了2列只查2列
//select  st.name as name  , sc.id as scid

想要自動看下面

實體自動映射1

語法最美,新功能(5.1.3.35)

 var list4=db.Queryable<SchoolA>()
                .LeftJoin<StudentA>((x, y) => (x.SchoolId == y.SchoolId))
                .Select((x,y) => new UnitView01()
                {
                     Name=x.SchoolName,
                     Count=100
                },
                true)//true表示 其餘字段自動映射,根據字段名字
               .ToList();

生成的Sql如下:

SELECT       [x].[ID] AS [id] , --自動
          [x].[TimeAS [Time] , --自動 
          [x].[SchoolName] AS [Name--手動 
          100 as [Count]  --手動
          FROM [SchoolA] x
          Left JOIN StudentA  y  ON ( [x].[SchoolId] =[y].[SchoolId])

實體自動映射2

說明:通過x.*方式實現多表查詢

//生成的SQL爲 Select o.*, [c].[Name] AS [CustomName]
var oneClass = db.Queryable<Order>()
             .LeftJoin<OrderItem>((o,i)=>o.Id == i.OrderId)
             .LeftJoin<Custom>((o,i,c)=>o.CustomId == c.Id)
             .Where(o=>o.Id>1)
.Select((o,i,c)=> new ViewOrder// 是一個新類
{      
   //Id是o任意一個屬性
   Id=o.Id.SelectAll(),   //  等於 o.*   (SelectAll建議用一張表,多表會容易重名)
   CustomName=c.Name   // 等於 [c].[Name] AS [CustomName]
}).ToList()

生成Sql如下

SELECT o.*, [c].[NameAS [CustomName] 
              FROM  [Order] o 
              Left JOIN [OrderItem] i ON ( [o].[Id] = [i].[OrderId] )  
              Left JOIN [Custom] c ON ( [o].[CustomId] = [c].[Id] ) WHERE [o].[Id]>1

實體自動映射3

說明:通過約束實現自動映射

比如一個3表查詢 Order 、 OrderItem、Custom

需要注意的是 Select用的是自動填充這樣使用方便,高併發的地方還是寫成上面那種方式(5.0.5.2性能優化提升)

public class ViewOrder
{
 public string Name { getset; } // ORDER表中的name 主表規則【字段名】
 public string CustomName { getset; }//查詢的是Custom中的的name 從表規則【class+字段名】
 public string OrderItemPrice { getset; }//查詢的是OrderItem中的name 從表規則【 class+字段名】
}
var viewModel= db.Queryable<Order>()
             .LeftJoin<OrderItem>((o,i)=>o.Id == i.OrderId)
             .LeftJoin<Custom>((o,i,c)=>o.CustomId == c.Id)
              .Select<ViewOrder>().ToList();

sql:

SELECT 
          o.[NameAS [Name],
          c.[NameAS [CustomName],
          i.[Price] AS [OrderItemPrice] 
          FROM [Order] o 
          Left JOIN [OrderItem] i ON ( [o].[Id] = [i].[OrderId] )  
          Left JOIN [Custom] c ON ( [o].[CustomId] = [c].[Id] )

注意: 

         1.ViewOrder必須每個列都能匹配到字段,否則就無法按規則匹配,保證每個列都正確

         2.高併發功能不建議使用,手寫的性能肯定高於自動映射

 

匿名對象自動映射

說明:自動主表賦值  表.*

.Select<dynamic>((st,sc)=> new  
   //id是st任意一個屬性
   id=st.Id.SelectAll(), //  st.*  (SelectAll建議只用一張表,不然查詢列會有重名)
   SchoolName=sc.Name // Name as  SchoolName
}).ToList()
//Select st.*,[sc].[Name] AS [schoolName]
 
//.SelectAll等同於SqlFunc.GetSelfAndAutoFill是個語法糖

 

 

創建DTO類

這樣就能快速拿到DTO類的實體字符串比手寫要快的多

string classtring=db.Qureyable<Order>().Select(....).ToClassString("命名空間");

 

多表查一表

var oneClass = db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(
    JoinType.Left, o.Id == i.OrderId,
    JoinType.Left, o.CustomId == c.Id
))
.Select((o, i, c) => c).ToList();

 

多表返回2表

var twoClass = db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(
JoinType.Left, o.Id == i.OrderId,
JoinType.Left, o.CustomId == c.Id
))
.Select((o, i, c) => new { o,i}).ToList()

 

雙查詢結果用法

當我們需要在select後在外面在包一層select,代碼如下

      var getAll = db.Queryable<Order>()
            .Select(it => new Order
            {
                Id = it.Id * 2,
                Name = it.Name
            })
            .MergeTable()//將上面的操作變成一個表 mergetable
            .GroupBy(it => it.Id)//對錶mergetable進行分組
            .Select(it =>new{ id=it.Id }).ToList();//查詢mergetable表裏面的字段
             
//SELECT `Id` FROM  
//           (  SELECT  
//                    ( `Id` * @Id0 ) AS `Id` , 
//                    `Name` AS `Name` 
//                                    
//                FROM `Order ) MergeTable 
// GROUP BY `Id`
// 參數 @Id0:2

Select之後對字段進行C#處理

方式1  (5.1.4.113-preview+)

只能返回string只能是個單參數

    public class UnitTool
    {
        public static string GetName(string name) //定義一個string
        {
            return "name" + 111;
        }
    }
     
  //獲取methodInfo    
  var methodInfo = typeof(UnitTool).GetMethod("GetName");
 
 var list8 = db.Queryable<Order>()
   .Select(it => new
   {
       n = it.Name,
       name = SqlFunc.OnlyInSelectConvertToString(it.Name, methodInfo)//只能是select中用
   }).ToList();

方式2 

相對方式1用法麻煩 支持的功能全些

實體類

var list= db.Queryable<Order>().Select(it=>new Order{ 
    Id=it.Id,
    Name=it.Name
    })
    .Mapper(it => { //只能寫在Select後面
        it.Name = it.Id + it.Name;//相當於ToList循環賦值
    }).ToList();

匿名對象

var list = db.Queryable<Order>().Select(it=>
        (dynamic)new  //轉成 dynamic
        
            Id=it.Id,
            Name=it.Name
    })
    .Mapper(it => { //只能寫在Select後面
        it.Name = it.Id + it.Name;//相當於ToList循環賦值
    }).ToList();

注意:(dynamic)不要漏了

 

動態Select

//方式1:多庫兼容
var selector= new List<SelectModel>() {
    new SelectModel(){AsName = "id1",FiledName = "id"},
    new SelectModel(){ FiledName = "id"}};
      
var list=db.Queryable<Order>()..Select(selector).ToList();
//更多複雜用法:https://www.donet5.com/Home/Doc?typeId=2421
  
//SELECT `id` AS `id1` , `id` AS `id` FROM `Order`
  
//方式2:直接寫SQL
var list=db.Queryable<Order>().Select("ID AS id1,id as id").ToList();
 
 
//方式3: 動態表達式 
StaticConfig.DynamicExpressionParserType = typeof(DynamicExpressionParser); //啓動時配置
 
var list= db.Queryable<Order>().Select("it", $"it=>new(it.Id as Id, it.Name)"typeof(Order)).ToList();
 
//需要SqlFunc:https://www.donet5.com/Home/Doc?typeId=2569

 

別名AS用法 

Select(it=>new { id1=it.id ,name2 =it.name })
//select id as id1,name as name2

如果是動態看 上面一個標題

 

返回元組

版本:5.1.4.84+

List<(int Id, string Name)> list
                = db.Queryable<Order>().Select<(int Id, string Name)>("id,name").ToList();

 

過濾某一個字段

   
/***單表***/
db.Queryable<Order>().IgnoreColumns(it=>it.Files).ToList();//只支持單表查詢
   
   
/***聯查***/
//是主表
var leftQuery=db.Queryable<Order>().IgnoreColumns(it=>it.Files);
var list=db.Queryable(leftQuery).LeftJoin<OrderDetails>((o,d)=>o.id==d.orderid).Select(o=>o).ToList();    
  
//是Join的表
var rightQuery= db.Queryable<OrderItem>().IgnoreColumns(it=>it.Files);
var list=db.Queryable<Order>().LeftJoin(rightQuery,(o,d)=>o.Id == d.OrderId).Select(o=>o).ToList();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章