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

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 {
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
; }
}
}
热忱回答(4)
-
fate sta VIP0
1个月前-
0 回复 -
fate sta VIP0
1个月前SqlSugarCore 5.1.4.174-preview01
已修复 ,过会勾预览 安装
0 回复 -
抱走 VIP0
1个月前@fate sta:谢谢小杰哥
0 回复 -
抱走 VIP0
1个月前还有请教下只查book的数据, 可以这样写吗? .Select("b.*",bookType)
0 回复