QueryableByObject联合AddJoinInfo和过滤器使用时会报错 返回

SqlSugar 待处理
1 213
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("用例跑完");



        // 问题3:可以帮忙在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 { get; set; }
public virtual bool? is_del { get; set; } = false;

[Navigate(NavigateType.OneToMany, nameof(Book.formId))]
public List<Book>? books { get; set; }
}

public class Book:IDeletedFilter
{
public int id { get; set; }
public virtual bool? is_del { get; set; } = false;

public int formId { get; set; }
}

public interface IDeletedFilter
{
        /// <summary>
        /// 软删除
        /// </summary>
bool? is_del { get; set; }
}

}


热忱回答1