QueryableByObject联合AddJoinInfo和过滤器使用时会报错 返回
SqlSugar
待处理
1
213

悬赏:5 飞吻
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)
-
抱走 VIP0
2025/1/8自己顶一下
0 回复