mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-08-20 00:44:19 +08:00
Compare commits
7 Commits
82dff2f2fd
...
ea0044572d
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ea0044572d | ||
![]() |
5c1929de44 | ||
![]() |
c8946cb193 | ||
![]() |
cd23338a43 | ||
![]() |
7f2332a7d7 | ||
![]() |
02eac0e48f | ||
![]() |
a6e33b73de |
@ -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();
|
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();
|
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();
|
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.CodeFirst.InitTables<IdsModel>();
|
||||||
db.DbMaintenance.TruncateTable<IdsModel>();
|
db.DbMaintenance.TruncateTable<IdsModel>();
|
||||||
var ids = new List<string> { ObjectId.GenerateNewId() + "" };
|
var ids = new List<string> { ObjectId.GenerateNewId() + "" };
|
||||||
|
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
@ -31,6 +31,7 @@ namespace OrmTest
|
|||||||
}
|
}
|
||||||
public static void Init()
|
public static void Init()
|
||||||
{
|
{
|
||||||
|
Unitdfaysfa.Init();
|
||||||
Unitsdfasfasa.Init();
|
Unitsdfasfasa.Init();
|
||||||
Unitdfsdyss.Init();
|
Unitdfsdyss.Init();
|
||||||
Unitadfasfafays.Init();
|
Unitadfasfafays.Init();
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -122,12 +122,85 @@ namespace SqlSugar.MongoDb
|
|||||||
}
|
}
|
||||||
else if (IsAnyMethodCall(methodCallExpression, name))
|
else if (IsAnyMethodCall(methodCallExpression, name))
|
||||||
{
|
{
|
||||||
return ProcessAnyExpression(methodCallExpression);
|
if (IsComplexAnyExpression(methodCallExpression))
|
||||||
|
{
|
||||||
|
return HandleComplexAnyExpression(methodCallExpression);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return ProcessAnyExpression(methodCallExpression);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
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)
|
private BsonValue ProcessAnyExpression(MethodCallExpression methodCallExpression)
|
||||||
{
|
{
|
||||||
// 处理 it.xx.Any(s => s.id == 1) 这种表达式
|
// 处理 it.xx.Any(s => s.id == 1) 这种表达式
|
||||||
|
@ -128,6 +128,15 @@ namespace SqlSugar
|
|||||||
}
|
}
|
||||||
return this.Clone().Select<int>(" COUNT(1) ").ToList().FirstOrDefault();
|
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;
|
MappingTableList expMapping;
|
||||||
int result;
|
int result;
|
||||||
_CountBegin(out expMapping, out result);
|
_CountBegin(out expMapping, out result);
|
||||||
|
@ -157,6 +157,15 @@ namespace SqlSugar
|
|||||||
var list = await this.Clone().Select<int>(" COUNT(1) ").ToListAsync();
|
var list = await this.Clone().Select<int>(" COUNT(1) ").ToListAsync();
|
||||||
return list.FirstOrDefault();
|
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;
|
MappingTableList expMapping;
|
||||||
int result;
|
int result;
|
||||||
_CountBegin(out expMapping, out result);
|
_CountBegin(out expMapping, out result);
|
||||||
|
Loading…
Reference in New Issue
Block a user