コード例 #1
0
        protected void PublishTableAudit(object sender, EventArgs e)
        {
            bool onlyShowTables   = AuditOptions.Items[0].Selected;
            bool onlyShowConflict = AuditOptions.Items[1].Selected;

            MetadataNewDa da   = new MetadataNewDa();
            var           pdec = new Caisis.Controller.PatientDataEntryController(null);

            DataTable dt = da.GetAllTableAndColumns();
            var       db = from row in dt.AsEnumerable()
                           let table                                                          = row["TABLE_NAME"].ToString()
                                                              let field                       = row["COLUMN_NAME"].ToString()
                                                                                     let pair = new { Table = table, Field = field }
            group pair by pair.Table into g
                      select new
            {
                Table  = g.Key,
                Fields = g.Select(t => t.Field)
            };
            var dbTableNames = db.ToDictionary(a => a.Table, a => a.Fields);

            var biz = from table in BusinessObject.GetAllTableNames()
                      from field in BusinessObject.GetFieldNames(table)
                      group field by table into g
                      select new
            {
                Table  = g.Key,
                Fields = g
            };
            var bizTableName       = biz.ToDictionary(a => a.Table, a => a.Fields.Select(f => f));
            var allTables          = dbTableNames.Keys.Union(bizTableName.Keys).Distinct();
            var tableAndFieldAudit = from table in allTables
                                     let indb                         = dbTableNames.ContainsKey(table)
                                                            let inbiz = bizTableName.ContainsKey(table)
                                                                        let dbFields = indb ? dbTableNames[table] : new string[0]
                                                                                       let bizFields = inbiz ? bizTableName[table] : new string[0]
                                                                                                       let allFields = dbFields.Union(bizFields).Distinct()
                                                                                                                       from field in allFields
                                                                                                                       orderby table, field
            let fieldInDB = indb && dbFields.Contains(field)
                            let fieldInBiz = inbiz && bizFields.Contains(field)
                                             where !onlyShowConflict || fieldInDB != fieldInBiz || (fieldInDB == false && fieldInBiz == false)
                                             select new
            {
                Table = table,
                Field = field,
                InDB  = fieldInDB,
                InBiz = fieldInBiz
            };

            if (onlyShowTables)
            {
                tableAndFieldAudit = from t in tableAndFieldAudit
                                     group t by t.Table into g
                                     select new
                {
                    Table = g.Key,
                    Field = "",
                    InDB  = g.Where(b => b.InDB).Count() == g.Count(),
                    InBiz = g.Where(b => b.InBiz).Count() == g.Count()
                };
            }

            AuditTableGrid.DataSource = tableAndFieldAudit;
            AuditTableGrid.DataBind();
        }