Update mongodb

This commit is contained in:
sunkaixuan 2025-06-29 17:37:56 +08:00
parent 808afe07fe
commit 6833b51ea5
3 changed files with 78 additions and 53 deletions

View File

@ -13,6 +13,7 @@ namespace MongoDbTest
public static void Init() public static void Init()
{ {
var db = DbHelper.GetNewDb(); var db = DbHelper.GetNewDb();
db.DbMaintenance.TruncateTable<OrderInfo>();
db.Insertable(new OrderInfo() { CreateTime = DateTime.Now, Name = "a", Price = 1 }) db.Insertable(new OrderInfo() { CreateTime = DateTime.Now, Name = "a", Price = 1 })
.ExecuteCommand(); .ExecuteCommand();
var ids = db.Insertable(new List<OrderInfo>(){ var ids = db.Insertable(new List<OrderInfo>(){

View File

@ -68,26 +68,7 @@ namespace SqlSugar.MongoDb
} }
return ExtractFieldPath(expr); return ExtractFieldPath(expr);
} }
private static bool IsDateProperty(Expression expr)
{
return !string.IsNullOrEmpty(BinaryExpressionTranslator.GetSystemDateMemberName(expr));
}
private static bool IsLength(MemberExpression oldMember)
{
if (oldMember.Member.Name != "Length")
return false;
var expressionType = oldMember.Expression?.Type;
if (expressionType == null)
return false;
return expressionType.IsArray
|| expressionType == typeof(string)
|| expressionType.FullName == "System.Span`1"
|| expressionType.FullName == "System.ReadOnlySpan`1";
}
private BsonValue ExtractFieldPath(Expression expr) private BsonValue ExtractFieldPath(Expression expr)
{ {
@ -103,32 +84,24 @@ namespace SqlSugar.MongoDb
{ {
_visitorContext.ExpType = typeof(MemberExpression); _visitorContext.ExpType = typeof(MemberExpression);
} }
string resultString = null; string resultString = GenerateFieldPath(expr, parts);
if (parts.Count == 1 && expr is ParameterExpression parameter&& _context?.context != null) var isJoin = this._context?.queryBuilder?.IsSingle() == false;
{
var entityInfo = _context.context.EntityMaintenance.GetEntityInfo(parameter.Type);
var columnInfo = entityInfo.Columns.FirstOrDefault(s => s.PropertyName == parts.First());
if (columnInfo != null)
{
resultString = columnInfo.DbColumnName;
}
else
{
resultString = string.Join(".", parts);
}
}
else
{
resultString = string.Join(".", parts);
}
var isJoin = this._context?.queryBuilder?.IsSingle()==false;
var shortName = ((ParameterExpression)expr)?.Name; var shortName = ((ParameterExpression)expr)?.Name;
var joinInfo = this._context?.queryBuilder?.JoinQueryInfos?.FirstOrDefault(it => it.ShortName.EqualCase(shortName)); var joinInfo = this._context?.queryBuilder?.JoinQueryInfos?.FirstOrDefault(it => it.ShortName.EqualCase(shortName));
bool isObj = ProcessJoinFieldPath(ref resultString, ref shortName, joinInfo);
if (isObj)
return BsonDocument.Parse(resultString);
else
return UtilMethods.MyCreate(resultString);
}
private bool ProcessJoinFieldPath(ref string resultString, ref string shortName, JoinQueryInfo joinInfo)
{
var isObj = false; var isObj = false;
if (joinInfo != null) if (joinInfo != null)
{ {
shortName = $"{joinInfo.ShortName}."; shortName = $"{joinInfo.ShortName}.";
if (this._context.resolveType.IsIn(ResolveExpressType.SelectSingle,ResolveExpressType.SelectMultiple)) if (this._context.resolveType.IsIn(ResolveExpressType.SelectSingle, ResolveExpressType.SelectMultiple))
{ {
// 构造 $ifNull 表达式 // 构造 $ifNull 表达式
var columnString = $"{{ \"$ifNull\": [\"${joinInfo.ShortName}.{resultString}\", null] }}"; var columnString = $"{{ \"$ifNull\": [\"${joinInfo.ShortName}.{resultString}\", null] }}";
@ -137,18 +110,66 @@ namespace SqlSugar.MongoDb
} }
else else
{ {
resultString = $"{joinInfo.ShortName}.{resultString}"; resultString = $"{joinInfo.ShortName}.{resultString}";
} }
} }
if (this._context!=null&&this._context.resolveType.IsIn(ResolveExpressType.WhereMultiple, ResolveExpressType.WhereSingle) &&this._context?.queryBuilder is MongoDbQueryBuilder mb&&mb.EasyJoin==false) resultString = TransformFieldPath(resultString, shortName);
return isObj;
}
private string GenerateFieldPath(Expression expr, Stack<string> parts)
{
string resultString = null;
if (parts.Count == 1 && expr is ParameterExpression parameter && _context?.context != null)
{
var entityInfo = _context.context.EntityMaintenance.GetEntityInfo(parameter.Type);
var columnInfo = entityInfo.Columns.FirstOrDefault(s => s.PropertyName == parts.First());
if (columnInfo != null)
{
resultString = columnInfo.DbColumnName;
}
else
{
resultString = string.Join(".", parts);
}
}
else
{
resultString = string.Join(".", parts);
}
return resultString;
}
private static bool IsDateProperty(Expression expr)
{
return !string.IsNullOrEmpty(BinaryExpressionTranslator.GetSystemDateMemberName(expr));
}
private static bool IsLength(MemberExpression oldMember)
{
if (oldMember.Member.Name != "Length")
return false;
var expressionType = oldMember.Expression?.Type;
if (expressionType == null)
return false;
return expressionType.IsArray
|| expressionType == typeof(string)
|| expressionType.FullName == "System.Span`1"
|| expressionType.FullName == "System.ReadOnlySpan`1";
}
private string TransformFieldPath(string resultString, string shortName)
{
if (this._context?.queryBuilder is MongoDbQueryBuilder mb && mb.EasyJoin == false)
{ {
if (mb.FirstParameter == shortName.TrimEnd('.')) if (mb.FirstParameter == shortName.TrimEnd('.'))
{ {
if (!mb.lets.ContainsKey(resultString)) if (!mb.lets.ContainsKey(resultString))
{ {
mb.lets.Add(resultString, $"${resultString}"); mb.lets.Add(resultString, $"${resultString}");
} }
resultString = $"${resultString}"; resultString = $"${resultString}";
} }
else if (mb.LastParameter == shortName.TrimEnd('.')) else if (mb.LastParameter == shortName.TrimEnd('.'))
{ {
@ -156,10 +177,8 @@ namespace SqlSugar.MongoDb
resultString = $"${resultString.TrimStart(replaceName.toCharArray())}"; resultString = $"${resultString.TrimStart(replaceName.toCharArray())}";
} }
} }
if (isObj)
return BsonDocument.Parse(resultString); return resultString;
else
return UtilMethods.MyCreate(resultString);
} }
} }

View File

@ -39,9 +39,10 @@ namespace SqlSugar.MongoDb
}; };
newJoins.add(result); newJoins.add(result);
queryBuilder.JoinQueryInfos = newJoins; queryBuilder.JoinQueryInfos = newJoins;
MongoDbQueryBuilder mb2 = null;
if (queryBuilder is MongoDbQueryBuilder mb) if (queryBuilder is MongoDbQueryBuilder mb)
{ {
mb2 = mb;
var exp = joinExpression as LambdaExpression; var exp = joinExpression as LambdaExpression;
mb.EasyJoin = exp.Body is BinaryExpression b && b.Left is MemberExpression l && b.Right is MemberExpression r && l.Expression is ParameterExpression && r.Expression is ParameterExpression; mb.EasyJoin = exp.Body is BinaryExpression b && b.Left is MemberExpression l && b.Right is MemberExpression r && l.Expression is ParameterExpression && r.Expression is ParameterExpression;
if (mb.EasyJoin==false) if (mb.EasyJoin==false)
@ -61,15 +62,19 @@ namespace SqlSugar.MongoDb
{ {
result.ShortName = queryBuilder.Builder.GetTranslationColumnName(result.ShortName); result.ShortName = queryBuilder.Builder.GetTranslationColumnName(result.ShortName);
} }
if (queryBuilder is MongoDbQueryBuilder mb2&&mb2.EasyJoin==false) if (mb2!=null)
{ {
var lets=mb2.lets; var lets=mb2.lets;
if (mb2.JoinQueryInfoLets == null) if (mb2.JoinQueryInfoLets == null)
{ {
mb2.JoinQueryInfoLets = new Dictionary<string, Dictionary<string, string>>(); mb2.JoinQueryInfoLets = new Dictionary<string, Dictionary<string, string>>();
} }
mb2.JoinQueryInfoLets.Add(result.ShortName, mb2.lets); if (mb2.EasyJoin==false)
} {
mb2.JoinQueryInfoLets.Add(result.ShortName, mb2.lets);
}
mb2.EasyJoin = null;
}
return result; return result;
} }