public static IEnumerable<ExtraInfo> CodeSummary() { var NameTypes = Views.GetViewableNameTypes(DbUtil.Db, "People", nocache: true); var standardtypes = new CodeValueModel().ExtraValueTypeCodes(); var adhoctypes = new CodeValueModel().AdhocExtraValueTypeCodes(); var qcodevalues = (from e in DbUtil.Db.PeopleExtras where e.Type == "Bit" || e.Type == "Code" group e by new { e.Field, val = e.StrValue ?? (e.BitValue == true ? "1" : "0"), e.Type, } into g select new { key = g.Key, count = g.Count() }).ToList(); var qcodes = from i in qcodevalues join sv in NameTypes on i.key.Field equals sv.Name into j from sv in j.DefaultIfEmpty() let type = sv == null ? i.key.Type : sv.Type let typedisplay = sv == null ? adhoctypes.Single(ee => ee.Code == type).Value : standardtypes.Single(ee => ee.Code == type).Value select new ExtraInfo { Field = i.key.Field, Value = i.key.val, Type = i.key.Type, TypeDisplay = typedisplay, Standard = sv != null, Count = i.count, CanView = sv == null || sv.CanView }; var qdatavalues = (from e in DbUtil.Db.PeopleExtras where !(e.Type == "Bit" || e.Type == "Code") where e.Type != "CodeText" group e by new { e.Field, e.Type, } into g select new { key = g.Key, count = g.Count() }).ToList(); var qdatums = from i in qdatavalues join sv in NameTypes on i.key.Field equals sv.Name into j from sv in j.DefaultIfEmpty() let type = sv == null ? i.key.Type : sv.Type let typedisplay = sv == null ? adhoctypes.SingleOrDefault(ee => ee.Code == type) : standardtypes.SingleOrDefault(ee => ee.Code == type) select new ExtraInfo { Field = i.key.Field, Value = "(multiple)", Type = i.key.Type, TypeDisplay = typedisplay == null ? (type ?? "unknown") : typedisplay.Value, Standard = sv != null, Count = i.count, CanView = sv == null || sv.CanView }; return qcodes.Union(qdatums).OrderBy(ee => ee.Field); }