简化检查索引属性上的唯一标志

时间:2014-12-18 15:46:33

标签: c# .net linq attributes refactoring

以下LINQ语句看似简单,但最终变得相当复杂。是否有更简单的方法来完成相同的任务,以及通过什么过程来解决这个问题?

public static bool ArePropertiesUnique(Type type, params string[] propNames)
{
    return type.GetProperties()
        .SelectMany(p => p.GetCustomAttributes(typeof(IndexAttribute), true)
            .OfType<IndexAttribute>()
            .Where(i => i.IsUnique))
        .GroupBy(g => g.Name)
            .Where(a => a.Count() == propNames.Count())
        .SelectMany(g => g)
            .Select(i => i.Name)
        .Intersect(propNames
            .Select(prop => type.GetProperty(prop)
            .GetCustomAttributes(typeof(IndexAttribute), true)
                .OfType<IndexAttribute>()
                .Where(i => i.IsUnique)
            .Select(i => i.Name))
        .Aggregate((list, list1) => list.Intersect(list1))).Any();
}

摘要

这段代码在整个类中查找索引属性,将它们与传入的属性名称进行比较,并查看这些属性是否包含一组索引,这些索引强制传入的属性名称组合是唯一的。

0 个答案:

没有答案