[Bug] 设置QueryFilter后,使用QueryableByObject进行join查询会报错(重复1) 返回

SqlSugar 处理完成
4 123

using System;

using System.Collections.Generic;

using System.Linq;

using System.Reflection;

using SqlSugar;

namespace OrmTest;


class Program

{

    static void Main(string[] args)

    {

        var db = new SqlSugarScope(new SqlSugar.ConnectionConfig()

        {

            ConnectionString = "server=.;uid=sa;pwd=odoo;database=SQLSUGAR5XTEST;MultipleActiveResultSets=True;Trust Server Certificate=true;",

            DbType = DbType.SqlServer,

            IsAutoCloseConnection = true

        });

        db.Aop.OnLogExecuting = (sql, pars) =>

        {

            Console.WriteLine("【" + DateTime.Now + "】\r\n" + UtilMethods.GetNativeSql(sql, pars) + "\r\n");

        };

 

        // 关键代码,添加过滤器

        db.QueryFilter.AddTableFilter<IDeletedFilter>(u => u.is_del == false);

 

        //建库 

        db.DbMaintenance.CreateDatabase();

        //建表 

        db.CodeFirst.InitTables<Test001,Book>();

        //清空表

        db.DbMaintenance.TruncateTable<Test001,Book>();

        var data = new Test001() {

            id = 1,

            books  =  [

                new Book { id = 1,}

            ]

        };

 

        var runProblem = false;

               //用例代码

        if(runProblem){

            // 意外发现这种方式插入测试数据,会闪退. 可能这里我写错了

            var result = db.InsertNav(data)

                .Include(it=>it.books)

                .ExecuteCommand();

        } else {

            // 这样插入没问题,用这个方式插入数据测试

            db.Insertable(data).ExecuteCommand();

            db.Insertable(data.books).ExecuteCommand();

        }

 

        var testType = typeof(Test001);

        var bookType = typeof(Book);

  

        // 问题1:这里执行报错 Exception has been thrown by the target of an invocation. 这种错误非常难定位问题,不知道有没有方案可以优化下提示

        // 跟踪报错关键点因为加了过滤器,在AddFilter()方法时,QueryBuild.cs里面一个循环 it.EntityType是null

        // foreach (var joinInfoItem in this.JoinQueryInfos.Where(it => it.EntityType.GetInterfaces().Any(z => z == ChildType)))

        // 又因为在QueryMethodInfo.cs 在AddJoinInfo 字符串版本没有给EntityType赋值

        var books = db.QueryableByObject(testType, "t")

            .AddJoinInfo(bookType,"b","t.id=b.formId")

            .Where($"t.Id={1}")

            // .Select("b.*",bookType) // 问题2:希望查询出 books 的数据,这里应该怎么写啊?

            .ToList();

 

        // var includeData = db.QueryableByObject(testType)

        //     .Includes("books")

        //     .Where($"id={1}")

        //     .select(..) 同问题2:类似这里应该怎么写

        //     .ToList();

  

        Console.WriteLine("用例跑完");

   

        // 最后:提个无关这个bug的需求,杰哥可以帮忙在IDbFirst 加个方法重载,或者加个方法(CreatedReplaceClassString)吗?这样可以有多点信息写更细致的模板

        // 在IDbFirst.cs 重载或加 CreatedReplaceClassString(Func<string,DbTableInfo?,string?,string> replaceClassStringFunc);

        // 在DbFirstProvider.cs额外把tableInfo和className传出去tableInfo,className

        // classText=this.ReplaceClassStringFunc(classText,tableInfo,className);

 

    }

    //建类

    public class Test001:IDeletedFilter

    {

        public int id { getset; }

        public virtual bool? is_del { getset; } = false;

 

        [Navigate(NavigateType.OneToMany, nameof(Book.formId))]

        public List<Book>? books { getset; }

    }

 

    public class Book:IDeletedFilter

    {

        public int id { getset; }

        public virtual bool? is_del { getset; } = false;

 

        public int formId { getset; }

    }

 

    public interface IDeletedFilter

    {

        /// <summary>

        /// 软删除

        /// </summary>

        bool? is_del { getset; }

    }

 

}


热忱回答4

  • fate sta fate sta VIP0
    1个月前

    -

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

    SqlSugarCore 5.1.4.174-preview01

    已修复 ,过会勾预览 安装

    0 回复
  • 抱走 抱走 VIP0
    1个月前

    @fate sta谢谢小杰哥

    0 回复
  • 抱走 抱走 VIP0
    1个月前

    还有请教下只查book的数据, 可以这样写吗? .Select("b.*",bookType)

    0 回复