以下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();
}
摘要
这段代码在整个类中查找索引属性,将它们与传入的属性名称进行比较,并查看这些属性是否包含一组索引,这些索引强制传入的属性名称组合是唯一的。