コード例 #1
0
ファイル: Parser.cs プロジェクト: sndnvaps/Kerosene.ORM
        /// <summary>
        /// Parsers a set member operation.
        /// </summary>
        protected virtual string OnParseSetMember(DynamicNode.SetMember obj, IParameterCollection pc, bool nulls)
        {
            string host  = obj.Host == null ? null : Parse(obj.Host, pc, nulls);
            string name  = host == null ? obj.Name : "{0}.{1}".FormatWith(host, obj.Name);
            string value = Parse(obj.Value, pc, nulls);

            return("{0} = ({1})".FormatWith(name, value));
        }
コード例 #2
0
        /// <summary>
        /// Generates an insert core command for the given entity, or returns null if such
        /// command cannot be generated for whatever reasons.
        /// </summary>
        internal static IInsertCommand GenerateInsertCommand(this IUberMap map, object entity)
        {
            if (entity == null)
            {
                return(null);
            }
            if (map == null || map.IsDisposed || !map.IsValidated)
            {
                return(null);
            }

            IInsertCommand cmd = null;

            int num = map.Schema.Count(x => !x.IsReadOnlyColumn);

            if (num != 0)
            {
                cmd = map.Link.Engine.CreateInsertCommand(map.Link, x => map.Table);

                var tag = new DynamicNode.Argument("x");
                var rec = new Core.Concrete.Record(map.Schema); map.WriteRecord(entity, rec);

                for (int i = 0; i < rec.Count; i++)
                {
                    if (rec.Schema[i].IsReadOnlyColumn)
                    {
                        continue;
                    }

                    var node = new DynamicNode.SetMember(tag, rec.Schema[i].ColumnName, rec[i]);
                    cmd.Columns(x => node);
                    node.Dispose();
                }

                tag.Dispose();
                rec.Dispose();
            }

            return(cmd);
        }
コード例 #3
0
ファイル: DataUpdate.cs プロジェクト: sndnvaps/Kerosene.ORM
        /// <summary>
        /// Generates an update core command for the given entity, or returns null if such
        /// command cannot be generated for whatever reasons.
        /// </summary>
        internal static IUpdateCommand GenerateUpdateCommand(this IUberMap map, object entity)
        {
            if (entity == null)
            {
                return(null);
            }
            if (map == null || map.IsDisposed || !map.IsValidated)
            {
                return(null);
            }

            IUpdateCommand cmd = null;

            MetaEntity meta = MetaEntity.Locate(entity, create: true); if (meta.Record == null)
            {
                var record = new Core.Concrete.Record(map.Schema);
                map.WriteRecord(entity, record);
                meta.Record = record;
            }

            var changes = meta.GetRecordChanges(); if (changes == null)
            {
                return(null);
            }

            var num = changes.Schema.Count(x => !x.IsReadOnlyColumn);

            if (num != 0)
            {
                var id = map.ExtractId(meta.Record); if (id != null)
                {
                    cmd = map.Link.Engine.CreateUpdateCommand(map.Link, x => map.Table);
                    if (map.Discriminator != null)
                    {
                        cmd.Where(map.Discriminator);
                    }

                    var tag = new DynamicNode.Argument("x");
                    for (int i = 0; i < id.Count; i++)
                    {
                        var left = new DynamicNode.GetMember(tag, id.Schema[i].ColumnName);
                        var bin  = new DynamicNode.Binary(left, ExpressionType.Equal, id[i]);
                        cmd.Where(x => bin);
                        left.Dispose();
                        bin.Dispose();
                    }

                    for (int i = 0; i < changes.Count; i++)
                    {
                        if (changes.Schema[i].IsReadOnlyColumn)
                        {
                            continue;
                        }

                        var node = new DynamicNode.SetMember(tag, changes.Schema[i].ColumnName, changes[i]);
                        cmd.Columns(x => node);
                        node.Dispose();
                    }

                    tag.Dispose();
                    id.Dispose();
                }
            }
            changes.Dispose(disposeSchema: true);

            return(cmd);
        }