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();
|
||||
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() + "" };
|
||||
|
@ -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()
|
||||
{
|
||||
Unitdfaysfa.Init();
|
||||
Unitsdfasfasa.Init();
|
||||
Unitdfsdyss.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))
|
||||
{
|
||||
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) 这种表达式
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user