可以自己重写Select里表达式的解析吗? 返回

SqlSugar
19 184
该叫什么 Anye 发布于1个月前
悬赏:5 飞吻

可以自己重写Select里表达式的解析吗?

热忱回答19

  • Anye Anye VIP0
    1个月前

    或者把SqlSugar的 Select解析后的语句返回再进行一遍自定义的解析

    0 回复
  • Anye Anye VIP0
    1个月前

    现在主要想解决实体类里包含的不只是基本类型的属性,还能包含嵌套的类对象属性
    然后 Select 能解析这些嵌套类对象里的基本类型属性,比如:

        public class TestDTO
        {
            public TestSubDTO SubOne { get; set; }
    
            public TestSubDTO SubTwo { get; set; }
        }
    
        public class TestSubDTO
        {
            public string NameOne { get; set; }
    
            public string NameTwo { get; set; }
        }

    如果Select TestDTO,然后赋值如下:

     db.Queryable<Order>()
     .Select(i => new TestDTO
                    {
                        SubOne = new TestSubDTO { NameOne = i.Name, NameTwo = i.Name },
                        SubTwo = new TestSubDTO { NameOne = i.Name, NameTwo = i.Name }
                    })

    怎么才能解析成
    Select 

    Name AS [SubOne.NameOne],

    Name AS [SubOne.NameTwo],

    Name AS [SubTwo.NameOne],

    Name AS [SubTwo.NameTwo],

    From Order
    然后返回的对象按.分割对应赋值到TestDTO里


    可行吗?


    0 回复
  • fate sta fate sta VIP0
    1个月前

    最新版本你现在写法支持的吧

    0 回复
  • fate sta fate sta VIP0
    1个月前
     db.Queryable<Order>()
     .Select(i => new TestDTO
                    {
                        SubOne = new TestSubDTO { NameOne = i.Name, NameTwo = i.Name },
                        SubTwo = new TestSubDTO { NameOne = i.Name, NameTwo = i.Name }
                    })


    0 回复
  • fate sta fate sta VIP0
    1个月前

    可以重现,晚点修复

    0 回复
  • fate sta fate sta VIP0
    1个月前

    发布了个预览版本  5.1.25-preview01 你测试一下

    0 回复
  • Anye Anye VIP0
    2周前

    @fate sta

    .Select(i => new TestDTO
                    {
                        SubOne = new TestSubDTO { NameOne = "kkkk", NameTwo = i.Price },
                        SubTwo = new TestSubDTO { NameOne = i.Name, NameTwo = i.Price }
                    })

    这样写好像还是有点问题?SubOne的NameOne仍然取i.Name的值而不是"kkkk"

    0 回复
  • @Anye:好的今天在发布个预览版本

    0 回复
  • Anye Anye VIP0
    2周前

    @fate sta:更到5.1.2.7版本了,还是取不到"kkkk"这个值

    0 回复
  • @Anye5.1.2.8-preview03已修复 ,升级最新预览版本

    0 回复
  • Anye Anye VIP0
    2周前

    @fate sta:可以了
    问一下这个这种写法后面有考虑支持Where,Any这些吗?

    0 回复
  • @Anye:说具体点什么样的WHERE和ANY

    0 回复
  • Anye Anye VIP0
    2周前

    @fate sta

    .Select(i => new TestDTO
                    {
                        SubOne = new TestSubDTO { NameOne = "kkkk", NameTwo = i.Price },
                        SubTwo = new TestSubDTO { NameOne = i.Name, NameTwo = i.Price }

                    })

    .Where(i=>i.SubOne.NameOne=="kkkk")

    .Select(i => new TestDTO
                    {
                        SubOne = new TestSubDTO { NameOne = "kkkk", NameTwo = i.Price },
                        SubTwo = new TestSubDTO { NameOne = i.Name, NameTwo = i.Price }

                    })

    .Any(i=>i.SubOne.NameOne=="kkkk")

    这种,我看现在还只支持了Select,但Where和Any就报导航查询错误,我按导航查询Include方式配置,还是把错误

    0 回复
  •  select().Tolist().Where

    0 回复
  • Anye Anye VIP0
    2周前

    @fate sta:这种相当于把数据全拉到服务器里再筛了

    0 回复
  • Anye Anye VIP0
    1周前

    @fate sta:其实应该可以多一种情况,在没配置Includes的情况下,直接把i.SubOne.NameOne当成[i.SubOne.NameOne]来='kkkk'就行了
    不知这样可不可行?

    0 回复
  • @Anye:SELECT字段都查出来了 内存不内存没什么区别了

    0 回复
  • Anye Anye VIP0
    5天前
    db.Queryable<Order>()
                    .LeftJoin<Order>((a,b)=>a.Id==b.Id)
                    .Select((a,b) => new GenericDTO
                    {
                        Name= new GenericSubDTO<string> { NameOne = b.Name, NameTwo = b.Name },
                        //SubOne = new GenericSubDTO<string> { NameOne = i.Name, NameTwo = i.Name },
                        //SubTwo = new GenericSubDTO<string> { NameOne = i.Name, NameTwo = i.Name }
                    });

    联表情况下,会变成SELECT  `b`.`Name` AS `Name.Name` , `b`.`Name` AS `Name.Name`  FROM `Order` a Left JOIN `Order` b ON ( `a`.`Id` = `b`.`Id` )   

    @fate sta

    0 回复
  • Anye Anye VIP0
    5天前

    @fate sta:按理说应该是SELECT  `b`.`Name` AS `Name.NameOne` , `b`.`Name` AS `Name.NameTwo`  FROM `Order` a Left JOIN `Order` b ON ( `a`.`Id` = `b`.`Id` )   这样的

    0 回复