Compare commits

...

7 Commits

Author SHA1 Message Date
sunkaixuan
ea0044572d Update mongodb 2025-08-15 11:55:22 +08:00
sunkaixuan
5c1929de44 Add demo 2025-08-15 11:51:41 +08:00
sunkaixuan
c8946cb193 Update mongodb 2025-08-15 11:51:35 +08:00
sunkaixuan
cd23338a43 Update mongodb 2025-08-15 11:24:29 +08:00
sunkaixuan
7f2332a7d7 Update mongoDb 2025-08-15 11:07:16 +08:00
sunkaixuan
02eac0e48f Add demo 2025-08-15 09:19:41 +08:00
sunkaixuan
a6e33b73de Optimize the performance of count 2025-08-15 09:19:18 +08:00
11 changed files with 268 additions and 3 deletions

View File

@ -38,8 +38,11 @@ namespace MongoDbTest
db.Insertable(new Student() { Age = 1, Name = "c", SchoolId = "1", Book = new List<Book>() { new Book() { SId = ObjectId.GenerateNewId() + "", CreateTime = DateTime.Now, Price = 21 } } }).ExecuteCommand();
var data6= db.Queryable<Student>().Where(it => it.Book.Any(s => s.Price == 21 &&s.SId==id)).ToList();
if(data6.Count!=1||data6.First().Name!="a") Cases.ThrowUnitError();
db.Insertable(new Student() { Age = 99, Name = "price=age", SchoolId = "1", Book = new List<Book>() { new Book() { SId = ObjectId.GenerateNewId() + "", CreateTime = DateTime.Now, Price = 99 } } }).ExecuteCommand();
var data7= db.Queryable<Student>().Where(it => it.Book.Any(s => s.Price == it.Age)).ToList();
var data8 = db.Queryable<Student>().Where(it => it.Book.Any(s => it.Age == s.Price)).ToList();
if(data7.Count != 1 || data8.Count!=1) Cases.ThrowUnitError();
if (data7.FirstOrDefault().Name!= "price=age" || data8.FirstOrDefault().Name != "price=age") Cases.ThrowUnitError();
db.CodeFirst.InitTables<IdsModel>();
db.DbMaintenance.TruncateTable<IdsModel>();
var ids = new List<string> { ObjectId.GenerateNewId() + "" };

View File

@ -0,0 +1,24 @@
using SqlSugar;
using System.ComponentModel.DataAnnotations.Schema;
namespace TestDemo.Entitys
{
[SugarTable("credit_confirm_level")]
public class PersonCreditLevel
{
[SugarColumn(ColumnName = "id", IsPrimaryKey = true)]
public int Id { get; set; }
/// <summary>
/// 身份证号码
///</summary>
[SugarColumn(ColumnName = "id_card")]
public string IdCard { get; set; }
/// <summary>
/// 信用等级
///</summary>
[SugarColumn(ColumnName = "level")]
public int Level { get; set; }
}
}

View File

@ -0,0 +1,23 @@
using SqlSugar;
using System.ComponentModel.DataAnnotations.Schema;
namespace TestDemo.Entitys
{
[SugarTable("person_info")]
public class PersonInfo
{
[SugarColumn(ColumnName = "id", IsPrimaryKey = true)]
public int Id { get; set; }
/// <summary>
/// 姓名
///</summary>
[SugarColumn(ColumnName = "name")]
public string Name { get; set; }
/// <summary>
/// 身份证号码
///</summary>
[SugarColumn(ColumnName = "id_card")]
public string IdCard { get; set; }
}
}

View File

@ -0,0 +1,25 @@
using SqlSugar;
using System.ComponentModel.DataAnnotations.Schema;
namespace TestDemo.Entitys
{
[SugarTable("person_job_title")]
public class PersonJobTitle
{
[SugarColumn(ColumnName = "id", IsPrimaryKey = true)]
public int Id { get; set; }
/// <summary>
/// 人员Id
/// </summary>
[SugarColumn(ColumnName = "person_id")]
public int PersonId { get; set; }
/// <summary>
/// 证书编号
///</summary>
[SugarColumn(ColumnName = "cert_no")]
public string CertNo { get; set; }
}
}

View File

@ -0,0 +1,24 @@
using SqlSugar;
namespace TestDemo.Entitys
{
public class PersonPageModelDto
{
public int Id { get; set; }
/// <summary>
/// 姓名
///</summary>
public string Name { get; set; }
/// <summary>
/// 身份证号码
///</summary>
[SugarColumn(ColumnName = "IdCard")]
public string IdCard { get; set; }
/// <summary>
///
///</summary>
public string CertNum { get; set; }
}
}

View File

@ -0,0 +1,25 @@
using SqlSugar;
using System.ComponentModel.DataAnnotations.Schema;
namespace TestDemo.Entitys
{
[SugarTable("person_reginfo")]
public class PersonReginfo
{
[SugarColumn(ColumnName = "id", IsPrimaryKey = true)]
public int Id { get; set; }
/// <summary>
/// 人员Id
/// </summary>
[SugarColumn(ColumnName = "person_id")]
public int PersonId { get; set; }
/// <summary>
/// 注册证书编号
///</summary>
[SugarColumn(ColumnName = "cert_num")]
public string CertNum { get; set; }
}
}

View File

@ -31,6 +31,7 @@ namespace OrmTest
}
public static void Init()
{
Unitdfaysfa.Init();
Unitsdfasfasa.Init();
Unitdfsdyss.Init();
Unitadfasfafays.Init();

View File

@ -0,0 +1,49 @@
using SqlSugar;
using System.Collections.Generic;
using System.Threading.Tasks;
using TestDemo.Entitys;
namespace OrmTest
{
public class Unitdfaysfa
{
public static void Init()
{
GetPerson().GetAwaiter().GetResult();
}
public static async Task<List<PersonPageModelDto>> GetPerson()
{
var db = NewUnitTest.Db;
db.CodeFirst.InitTables<PersonInfo, PersonReginfo, PersonJobTitle, PersonCreditLevel>();
var listQuery = new List<ISugarQueryable<PersonPageModelDto>>();
var queryReginfo = db.Queryable<PersonInfo>()
.LeftJoin<PersonReginfo>((p, r) => p.Id == r.PersonId)
.Select((p, r) => new PersonPageModelDto
{
Id = p.Id,
Name = p.Name,
IdCard = p.IdCard,
CertNum = r.CertNum
});
var queryTitle = db.Queryable<PersonInfo>()
.LeftJoin<PersonJobTitle>((p, r) => p.Id == r.PersonId)
.Select((p, r) => new PersonPageModelDto
{
Id = p.Id,
Name = p.Name,
IdCard = p.IdCard,
CertNum = r.CertNo
});
var query = db.UnionAll(queryTitle, queryReginfo).MergeTable().Where(x => SqlFunc.Subqueryable<PersonCreditLevel>().Where(s => s.IdCard == x.IdCard && s.Level == 8).NotAny());
var pagelist = await query.Clone().CountAsync();
var pagelist2 = query.Clone().Count();
return null;
}
}
}

View File

@ -122,12 +122,85 @@ namespace SqlSugar.MongoDb
}
else if (IsAnyMethodCall(methodCallExpression, name))
{
return ProcessAnyExpression(methodCallExpression);
if (IsComplexAnyExpression(methodCallExpression))
{
return HandleComplexAnyExpression(methodCallExpression);
}
else
{
return ProcessAnyExpression(methodCallExpression);
}
}
return result;
}
}
private BsonValue HandleComplexAnyExpression(MethodCallExpression methodCallExpression)
{
// 处理 it.Book.Any(s => s.Price == it.Age) 这种主表字段关联的 Any 表达式
// 参数1: 集合字段 it.Book
// 参数2: Lambda 表达式 s => s.Price == it.Age
var memberExpression = methodCallExpression.Arguments[0] as MemberExpression;
var lambdaExpression = methodCallExpression.Arguments[1] as LambdaExpression;
var firstParameterName = lambdaExpression.Parameters.FirstOrDefault().Name;
// 获取集合字段名
var collectionField = MongoNestedTranslator.TranslateNoFieldName(
memberExpression,
_context,
new ExpressionVisitorContext { IsText = true }
)?.ToString();
// 处理 Lambda 表达式体
var body = lambdaExpression.Body;
// 支持多种比较操作
if (body is BinaryExpression binaryExpr)
{
// 左右表达式
var left = binaryExpr.Left;
var right = binaryExpr.Right;
if (ExpressionTool.GetParameters(right).Any(s => s.Name == firstParameterName))
{
left = binaryExpr.Right;
right = binaryExpr.Left;
}
string leftField = MongoNestedTranslator.TranslateNoFieldName(left, _context, new ExpressionVisitorContext { IsText = true })?.ToString();
string rightField = MongoNestedTranslator.TranslateNoFieldName(right, _context, new ExpressionVisitorContext { IsText = true })?.ToString();
// 映射表达式类型到Mongo操作符
string mongoOperator = binaryExpr.NodeType switch
{
ExpressionType.Equal => "$eq",
ExpressionType.NotEqual => "$ne",
ExpressionType.GreaterThan => "$gt",
ExpressionType.GreaterThanOrEqual => "$gte",
ExpressionType.LessThan => "$lt",
ExpressionType.LessThanOrEqual => "$lte",
_ => null
};
if (mongoOperator != null)
{
var mapDoc = new BsonDocument
{
{ "input", $"${collectionField}" },
{ "as", "b" },
{ "in", new BsonDocument(mongoOperator, new BsonArray { $"$$b.{leftField}", $"${rightField}" }) }
};
var anyElementTrueDoc = new BsonDocument("$expr", new BsonDocument("$anyElementTrue", new BsonDocument("$map", mapDoc)));
return anyElementTrueDoc;
}
}
return null;
}
private static bool IsComplexAnyExpression(MethodCallExpression methodCallExpression)
{
return methodCallExpression.Arguments.Count == 2 && ExpressionTool.GetParameters(methodCallExpression.Arguments[1]).Select(s => s.Name).Distinct().Count() == 2;
}
private BsonValue ProcessAnyExpression(MethodCallExpression methodCallExpression)
{
// 处理 it.xx.Any(s => s.id == 1) 这种表达式

View File

@ -128,6 +128,15 @@ namespace SqlSugar
}
return this.Clone().Select<int>(" COUNT(1) ").ToList().FirstOrDefault();
}
if (this.QueryBuilder.AsTables?.Any() == true)
{
var tableName = this.QueryBuilder.AsTables.FirstOrDefault().Value;
if (tableName.StartsWith(" (SELECT * FROM ("))
{
var list = this.Clone().Select<int>(" COUNT(1) ").ToList();
return list.FirstOrDefault();
}
}
MappingTableList expMapping;
int result;
_CountBegin(out expMapping, out result);

View File

@ -157,6 +157,15 @@ namespace SqlSugar
var list = await this.Clone().Select<int>(" COUNT(1) ").ToListAsync();
return list.FirstOrDefault();
}
if (this.QueryBuilder.AsTables?.Any() == true)
{
var tableName= this.QueryBuilder.AsTables.FirstOrDefault().Value;
if (tableName.StartsWith(" (SELECT * FROM ("))
{
var list = await this.Clone().Select<int>(" COUNT(1) ").ToListAsync();
return list.FirstOrDefault();
}
}
MappingTableList expMapping;
int result;
_CountBegin(out expMapping, out result);