可以在LinqPad中并排显示两个查询结果吗?

时间:2018-07-20 21:08:10

标签: linqpad

我想知道是否可以在LinqPad中并排显示两个查询结果,而不是从上到下显示吗? 即同一条记录具有两个不同的查询,以便我可以并排查看以比较数据?

2 个答案:

答案 0 :(得分:0)

使用某些扩展方法,您可以将任何Object转换为代表字段和属性及其值的Dictionary<string,object>。然后,您可以加入他们。

TypeMemberInfo上的某些扩展方法可以更轻松地一起使用属性和字段:

public static class TypeExt {
    public static MemberInfo[] GetPropertiesOrFields(this Type t, BindingFlags bf = BindingFlags.Public | BindingFlags.Instance) =>
        t.GetMembers(bf).Where(mi => mi.MemberType == MemberTypes.Field | mi.MemberType == MemberTypes.Property).ToArray();
}

public static class MemberInfoExt {
    public static object GetValue(this MemberInfo member, object srcObject) {
        switch (member) {
            case FieldInfo mfi:
                return mfi.GetValue(srcObject);
            case PropertyInfo mpi:
                return mpi.GetValue(srcObject);
            default:
                throw new ArgumentException("MemberInfo must be of type FieldInfo or PropertyInfo", nameof(member));
        }
    }
}

有了这些助手,您可以将object转换为Dictionary<string,object>

public static class ObjectExt {
    public static IDictionary<string, object> ToDictionary(this object item) {
        if (item is IDictionary<string, object> id)
            return id;
        else {
            var dictAnsObj = new Dictionary<string, object>();

            foreach (var prop in item.GetType().GetPropertiesOrFields()) {
                try {
                    dictAnsObj.Add(prop.Name, prop.GetValue(item));
                }
                catch (Exception ex) {
                    dictAnsObj.Add(prop.Name, ex);
                }
            }

            return dictAnsObj;
        }
    }

    public class SideBySideClass {
        public string Key;
        public object Left;
        public object Right;
    }

    public static IEnumerable<SideBySideClass> SideBySide(this object left, object right) {
        return left.ToDictionary()
                   .Join(right.ToDictionary(),
                         kvp => kvp.Key,
                         kvp => kvp.Key,
                         (l, r) => new SideBySideClass() { Key = l.Key, Left = l.Value, Right = r.Value })
                   .OrderBy(sxs => sxs.Key);
    }
}

object转换为两个字典后,很容易将它们加入成员名称中,然后LINQPad会并排输出它们。如果r1r2是您的单条记录,则:

r1.SideBySide(r2).Dump();

将它们并排输出。

使用一些小的更改,您可以添加另一列以显示哪些值不同。

您也可以在某个id字段上join记录两组记录,并将它们并排输出。这是一种扩展方法:

public static IEnumerable<IEnumerable<SideBySideClass>> SidesBySides<T, TKey>(this IEnumerable<T> lefts, IEnumerable<T> rights, Func<T,TKey> keyFn) =>
    lefts.Join(rights, keyFn, keyFn, (l, r) => l.SideBySide(r));

答案 1 :(得分:0)

一种轻巧的选择是将它们制成一个Tuple数组,然后从那里开始:

Person a = GetA();
Person b = GetB();

Tuple<Person, Person> tup = new Tuple<Person, Person>(a, b);
Tuple<Person, Person>[] tupArray = new[] { tup };
tupArray.Dump(1);