QueryableByObject联合AddJoinInfo和过滤器使用时会报错 返回
SqlSugar
待处理
1
482
悬赏: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 回复