コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: UpdateProvider.cs プロジェクト: mal0211/FreeSql
        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);
        }
コード例 #3
0
        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);
        }