我在数据库中有2个表Department和SubDepartment。每个部门可以有或不能有多个子部门。我正在从这两个表中获取数据,以以下类的形式组合。
这个类在两个表中都有更多的属性
public class Department
{
public int DepartmentId { get; set; }
public string DepartmentName { get; set; }
public int SubDepartmentId { get; set; }
public string SubDepartmentName { get; set; }
}
例如,数据可以是DepartmentScience它将有多个子部门物理化学,。也可以用英文它将有一个子部门作为英语。
现在,从从DB中获取的List of Departments collection形式的数据中,我必须提取那些有多个子部门的部门。
代码如下:
List<Department> departments = new List<Department>();
// Here fetching deptids which are having multi sub deptids
var multidepartmentIds = departments .GroupBy(x => x.DepartmentId)
.Where(x => x.Count() > 1)
.Select(x => new { DepartmentId = x.Key }).ToList();
// Here getting the entire data/item for each dept and subdept
var finalDeptData = departments.Where(x => multidepartmentIds.Any(y => y.DepartmentId == x.DepartmentId)).ToList();
有没有更好的方法来实现这个?
我还想到了一种方法,在Count之后的单个lambda语句中,我们可以拥有具有所有类属性的匿名类型,但问题是我必须将此集合返回给调用方方法,然后在这种情况下,我必须将匿名集合返回为类型对象,这将需要更改调用方方法。
帮忙吗? ?
看看你的代码,在我看来,你正试图获得所有子部门的列表,他们的部门有多个子部门。在本例中,您可以这样做:
List<Department> departments = new List<Department>();
// Here fetching deptids which are having multi sub deptids
var multidepartmentIds = departments
.GroupBy(x => x.DepartmentId)
.Where(x => x.Count() > 1)
.SelectMany(x => x)
.ToList();
不需要创建一个匿名类型来保存单个值。由于您正在查找id集合中的匹配项,因此请使用HashSet
来保存它们:
// Here fetching deptids which are having multi sub deptids
var multidepartmentIds = departments.GroupBy(d => d.DepartmentId)
.Where(dg => dg.Count() > 1)
.Select(dg => dg.Key)
.ToHashSet();
// Here getting the entire data/item for each dept and subdept
var finalDeptData = departments.Where(d => multidepartmentIds.Contains(d.DepartmentId)).ToList();
但是,由于您真正想要的是出现多次的所有departments
,因此您可以在一条语句中完成:
// find all departments with multiple sub deptids and return them
var finalDeptData2 = departments.GroupBy(d => d.DepartmentId)
.Where(dg => dg.Count() > 1)
.SelectMany(dg => dg)
.ToList();
我想有一个扩展方法:
public static class IEnumerableExt {
public static IEnumerable<T> DuplicatesBy<T,TKey>(this IEnumerable<T> src, Func<T,TKey> keyFn, IEqualityComparer<TKey> comparer = null)
=> src.GroupBy(s => keyFn(s), comparer).Where(sg => sg.Count() > 1).SelectMany(sg => sg);
}
可以这样使用:
var findDeptData3 = departments.DuplicatesBy(d => d.DepartmentId).ToList();