mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-07-17 01:46:18 +08:00
Update mongodb
This commit is contained in:
parent
808afe07fe
commit
6833b51ea5
@ -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>(){
|
||||||
|
@ -69,25 +69,6 @@ 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,8 +84,43 @@ namespace SqlSugar.MongoDb
|
|||||||
{
|
{
|
||||||
_visitorContext.ExpType = typeof(MemberExpression);
|
_visitorContext.ExpType = typeof(MemberExpression);
|
||||||
}
|
}
|
||||||
|
string resultString = GenerateFieldPath(expr, parts);
|
||||||
|
var isJoin = this._context?.queryBuilder?.IsSingle() == false;
|
||||||
|
var shortName = ((ParameterExpression)expr)?.Name;
|
||||||
|
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;
|
||||||
|
if (joinInfo != null)
|
||||||
|
{
|
||||||
|
shortName = $"{joinInfo.ShortName}.";
|
||||||
|
if (this._context.resolveType.IsIn(ResolveExpressType.SelectSingle, ResolveExpressType.SelectMultiple))
|
||||||
|
{
|
||||||
|
// 构造 $ifNull 表达式
|
||||||
|
var columnString = $"{{ \"$ifNull\": [\"${joinInfo.ShortName}.{resultString}\", null] }}";
|
||||||
|
resultString = columnString;
|
||||||
|
isObj = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resultString = $"{joinInfo.ShortName}.{resultString}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resultString = TransformFieldPath(resultString, shortName);
|
||||||
|
return isObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GenerateFieldPath(Expression expr, Stack<string> parts)
|
||||||
|
{
|
||||||
string resultString = null;
|
string resultString = null;
|
||||||
if (parts.Count == 1 && expr is ParameterExpression parameter&& _context?.context != null)
|
if (parts.Count == 1 && expr is ParameterExpression parameter && _context?.context != null)
|
||||||
{
|
{
|
||||||
var entityInfo = _context.context.EntityMaintenance.GetEntityInfo(parameter.Type);
|
var entityInfo = _context.context.EntityMaintenance.GetEntityInfo(parameter.Type);
|
||||||
var columnInfo = entityInfo.Columns.FirstOrDefault(s => s.PropertyName == parts.First());
|
var columnInfo = entityInfo.Columns.FirstOrDefault(s => s.PropertyName == parts.First());
|
||||||
@ -121,26 +137,31 @@ namespace SqlSugar.MongoDb
|
|||||||
{
|
{
|
||||||
resultString = string.Join(".", parts);
|
resultString = string.Join(".", parts);
|
||||||
}
|
}
|
||||||
var isJoin = this._context?.queryBuilder?.IsSingle()==false;
|
|
||||||
var shortName = ((ParameterExpression)expr)?.Name;
|
return resultString;
|
||||||
var joinInfo = this._context?.queryBuilder?.JoinQueryInfos?.FirstOrDefault(it => it.ShortName.EqualCase(shortName));
|
|
||||||
var isObj = false;
|
|
||||||
if (joinInfo != null)
|
|
||||||
{
|
|
||||||
shortName = $"{joinInfo.ShortName}.";
|
|
||||||
if (this._context.resolveType.IsIn(ResolveExpressType.SelectSingle,ResolveExpressType.SelectMultiple))
|
|
||||||
{
|
|
||||||
// 构造 $ifNull 表达式
|
|
||||||
var columnString = $"{{ \"$ifNull\": [\"${joinInfo.ShortName}.{resultString}\", null] }}";
|
|
||||||
resultString = columnString;
|
|
||||||
isObj = true;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
private static bool IsDateProperty(Expression expr)
|
||||||
{
|
{
|
||||||
resultString = $"{joinInfo.ShortName}.{resultString}";
|
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";
|
||||||
}
|
}
|
||||||
if (this._context!=null&&this._context.resolveType.IsIn(ResolveExpressType.WhereMultiple, ResolveExpressType.WhereSingle) &&this._context?.queryBuilder is MongoDbQueryBuilder mb&&mb.EasyJoin==false)
|
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('.'))
|
||||||
{
|
{
|
||||||
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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>>();
|
||||||
}
|
}
|
||||||
|
if (mb2.EasyJoin==false)
|
||||||
|
{
|
||||||
mb2.JoinQueryInfoLets.Add(result.ShortName, mb2.lets);
|
mb2.JoinQueryInfoLets.Add(result.ShortName, mb2.lets);
|
||||||
}
|
}
|
||||||
|
mb2.EasyJoin = null;
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user