public override string ParseExp(Expression[] members) { if (members.Any() == false) { return(_map.DbField); } var parentName = ((members.FirstOrDefault() as MemberExpression)?.Expression as MemberExpression)?.Member.Name; switch (parentName) { case "Key": var read = _map; for (var a = 0; a < members.Length; a++) { read = read.Childs.Where(z => z.CsName == (members[a] as MemberExpression)?.Member.Name).FirstOrDefault(); if (read == null) { return(null); } } return(read.DbField); case "Value": var tb = _tables.First(); var foridx = 0; if (members.Length > 1) { var mem0 = (members.FirstOrDefault() as MemberExpression); var mem0Name = mem0?.Member.Name; if (mem0Name?.StartsWith("Item") == true && int.TryParse(mem0Name.Substring(4), out var tryitemidx)) { if (tryitemidx == 1) { foridx++; } else { //var alias = $"SP10{(char)(96 + tryitemidx)}"; var tmptb = _tables.Where((a, idx) => //a.AliasInit == alias && a.Table.Type == mem0.Type && idx == tryitemidx - 1).FirstOrDefault(); if (tmptb != null) { tb = tmptb; foridx++; } } } } var parmExp = Expression.Parameter(tb.Table.Type, tb.Alias); Expression retExp = parmExp; for (var a = foridx; a < members.Length; a++) { switch (members[a].NodeType) { case ExpressionType.Call: retExp = Expression.Call(retExp, (members[a] as MethodCallExpression).Method); break; case ExpressionType.MemberAccess: retExp = Expression.MakeMemberAccess(retExp, (members[a] as MemberExpression).Member); break; default: return(null); } } return(_comonExp.ExpressionLambdaToSql(retExp, new CommonExpression.ExpTSC { _tables = _tables, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = true, style = CommonExpression.ExpressionStyle.Where })); } return(null); }
public IUpdate <T1> Set <TMember>(Expression <Func <T1, TMember> > exp) { var body = exp?.Body; var nodeType = body?.NodeType; switch (nodeType) { case ExpressionType.Equal: _set.Append(", ").Append(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, exp, null)); return(this); case ExpressionType.MemberInit: var initExp = body as MemberInitExpression; if (initExp.Bindings?.Count > 0) { for (var a = 0; a < initExp.Bindings.Count; a++) { var initAssignExp = (initExp.Bindings[a] as MemberAssignment); if (initAssignExp == null) { continue; } var memberName = initExp.Bindings[a].Member.Name; if (_table.ColumnsByCsIgnore.ContainsKey(memberName)) { continue; } if (_table.ColumnsByCs.TryGetValue(memberName, out var col) == false) { throw new Exception($"找不到属性:{memberName}"); } var memberValue = _commonExpression.ExpressionLambdaToSql(initAssignExp.Expression, new CommonExpression.ExpTSC { isQuoteName = true }); _setIncr.Append(", ").Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = ").Append(memberValue); } } return(this); case ExpressionType.New: var newExp = body as NewExpression; if (newExp.Members?.Count > 0) { for (var a = 0; a < newExp.Members.Count; a++) { var memberName = newExp.Members[a].Name; if (_table.ColumnsByCsIgnore.ContainsKey(memberName)) { continue; } if (_table.ColumnsByCs.TryGetValue(memberName, out var col) == false) { throw new Exception($"找不到属性:{memberName}"); } var memberValue = _commonExpression.ExpressionLambdaToSql(newExp.Arguments[a], new CommonExpression.ExpTSC { isQuoteName = true }); _setIncr.Append(", ").Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = ").Append(memberValue); } } return(this); } if (body is BinaryExpression == false && nodeType != ExpressionType.Call) { return(this); } var cols = new List <SelectColumnInfo>(); var expt = _commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, cols, exp, null); if (cols.Any() == false) { return(this); } foreach (var col in cols) { if (col.Column.Attribute.IsNullable == true && col.Column.Attribute.MapType.IsNullableType()) { var replval = _orm.CodeFirst.GetDbInfo(col.Column.Attribute.MapType.GenericTypeArguments.FirstOrDefault())?.defaultValue; if (replval == null) { continue; } var replname = _commonUtils.QuoteSqlName(col.Column.Attribute.Name); expt = expt.Replace(replname, _commonUtils.IsNull(replname, _commonUtils.FormatSql("{0}", replval))); } } _setIncr.Append(", ").Append(_commonUtils.QuoteSqlName(cols.First().Column.Attribute.Name)).Append(" = ").Append(expt); return(this); }
public override string ParseExp(Expression[] members) { ParseExpMapResult = null; if (members.Any() == false) { ParseExpMapResult = _map; return(_map.DbField); } var firstMember = ((members.FirstOrDefault() as MemberExpression)?.Expression as MemberExpression); var parentName = firstMember?.Member.Name; switch (parentName) { case "Key": var read = _map; for (var a = 0; a < members.Length; a++) { read = read.Childs.Where(z => z.CsName == (members[a] as MemberExpression)?.Member.Name).FirstOrDefault(); if (read == null) { return(null); } } ParseExpMapResult = read; return(read.DbField); case "Value": var curtables = _tables; SelectTableInfo curtable = null; var foridx = 0; if (_select._diymemexpWithTempQuery != null && _select._diymemexpWithTempQuery is Select0Provider.WithTempQueryParser tempQueryParser) { if (_select._tables.Count == 1) { curtable = _select._tables[0]; } else { curtables = _select._tables; LocalValueInitData(); } if (tempQueryParser._outsideTable.Contains(curtable)) { for (var a = 0; a < members.Length; a++) { members[a] = new CommonExpression.ReplaceVisitor().Modify(members[a], firstMember, curtable.Parameter); } var ret = _select._diymemexpWithTempQuery.ParseExp(members); ParseExpMapResult = _select._diymemexpWithTempQuery.ParseExpMapResult; return(ret); } } else { LocalValueInitData(); } void LocalValueInitData() { curtable = curtables.First(); if (members.Length > 1) { var mem0 = (members.FirstOrDefault() as MemberExpression); var mem0Name = mem0?.Member.Name; if (mem0Name?.StartsWith("Item") == true && int.TryParse(mem0Name.Substring(4), out var tryitemidx)) { if (tryitemidx == 1) { foridx++; } else { //var alias = $"SP10{(char)(96 + tryitemidx)}"; var tmptb = curtables.Where((a, idx) => //a.AliasInit == alias && a.Table.Type == mem0.Type && idx == tryitemidx - 1).FirstOrDefault(); if (tmptb != null) { curtable = tmptb; foridx++; } } } } } var parmExp = Expression.Parameter(curtable.Table.Type, curtable.Alias); Expression retExp = parmExp; for (var a = foridx; a < members.Length; a++) { switch (members[a].NodeType) { case ExpressionType.Call: retExp = Expression.Call(retExp, (members[a] as MethodCallExpression).Method); break; case ExpressionType.MemberAccess: retExp = Expression.MakeMemberAccess(retExp, (members[a] as MemberExpression).Member); break; default: return(null); } } return(_comonExp.ExpressionLambdaToSql(retExp, new CommonExpression.ExpTSC { _tables = _tables, _tableRule = _select._tableRule, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = true, style = CommonExpression.ExpressionStyle.Where })); } return(null); }