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(); }