C# 从列表组中选择两个或多个部门的公共元素,然后进行计数
我有一门课看起来是这样的:C# 从列表组中选择两个或多个部门的公共元素,然后进行计数,c#,linq,.net-3.5,C#,Linq,.net 3.5,我有一门课看起来是这样的: { public class Category { public int Id { get; set; } public string Name { get; set; } public int CategoryId { get; set; } public int DepId{ get; set; } } } ID | Name | CategoryId |
{
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public int DepId{ get; set; }
}
}
ID | Name | CategoryId | DepId
---------------------------------------
1 | Post | 1 | 1
2 | Post | 1 | 2
3 | Printer | 2 | 1
4 | Printer | 2 | 3
5 | Post | 3 | 3
6 | Printer | 2 | 1
我的列表中折叠的数据如下所示:
{
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public int DepId{ get; set; }
}
}
ID | Name | CategoryId | DepId
---------------------------------------
1 | Post | 1 | 1
2 | Post | 1 | 2
3 | Printer | 2 | 1
4 | Printer | 2 | 3
5 | Post | 3 | 3
6 | Printer | 2 | 1
此数据保存对某些类别的访问数据
我想得到的是两个或更多部门的通用类别
如果用户选择他想要id为1的部门的类别,那么他应该得到id为1和3的元素,但是如果他想要部门1和3的类别,他应该得到元素4和6
对于1,3中的DepId,我希望得到以下结果:
Name | CategoryId
----------------------
Printer | 2
类似于加入SQL
我能够用sql编写代码:
SELECT * FROM(
SELECT
C.Cat_Id AS Id,
MAX(C.Name) AS Name,
FROM
Categories_Access AS CA (NOLOCK)
JOIN dbo.Categories AS C (NOLOCK) ON C.Cat_Id = CA.Cat_Id
WHERE
CA.DepId IN (1,3)
GROUP BY C.Cat_Id
HAVING COUNT(*)=2
) A ORDER BY A.Name
现在我想用C做同样的事情
编辑
这是我的尝试:
var cat = new List<Category>();
cat.Add(new Category {Id = 1, CategoryId = 1, Name = "Post", DepId = 1});
cat.Add(new Category {Id = 2, CategoryId = 1, Name = "Post", DepId = 2});
cat.Add(new Category {Id = 3, CategoryId = 2, Name = "Printer", DepId = 1});
cat.Add(new Category {Id = 4, CategoryId = 2, Name = "Printer", DepId = 3});
cat.Add(new Category {Id = 5, CategoryId = 3, Name = "Another", DepId = 3});
cat.Add(new Category {Id = 6, CategoryId = 2, Name = "Printer", DepId = 1});
cat.Add(new Category {Id = 7, CategoryId = 4, Name = "Else", DepId = 1});
var ids = new List<int> {1, 2};
var Query = from p in cat.Where(i => ids.Contains(i.DepId)).GroupBy(p => p.CategoryId)
select new
{
count = p.Count(),
p.First().Name,
p.First().CategoryId
};
我需要做的只是选择count=id.count的项目
我的最终版本基于@roughnex答案:
private static IEnumerable<Cat> Filter(IEnumerable<Category> items, List<int> ids)
{
return items.Where(d => ids.Contains(d.DepId))
.GroupBy(g => new { g.CategoryId, g.Name })
.Where(g => g.Count() == ids.Count)
.Select(g => new Cat { Id = g.Key.CategoryId, Name = g.Key.Name });
}
在C LINQ中选择要使用的常用元素
List<int> Depts = new List<int>() {1, 3};
var result = Categories.Where(d => Depts.Contains(d.DeptId))
.GroupBy(g => new {g.CatId, g.Name})
.Where(g => g.Count() >= 2)
.Select(g => new {g.Key.CatId, g.Key.Name});
因此,根据您所说的,您已经将SQL过程中的数据解析为一个列表。如果是这样的话,下面的代码片段应该可以指导您:
var items = new List<Category>();
var deptIds = new List<int>() { 1, 3 };
var query = items.Where(item => deptIds.Contains(item.DepId))
.Select(category => category);
当您想要在LINQ中执行IN时,必须反转它并使用Contains。而在SQL中,它是List中的ColumnName,而在LINQ中,它是List.ContainsColumnName。希望能有所帮助。您是否设置了要加入LINQ to SQL DBML或实体框架EDMX模型的两个表?我的应用程序中已经有了类别对象列表,它们来自SQL过程。我现在要做的是查询常见类别的列表,而不是我想的那样。我已经在我的问题中添加了我版本的解决方案,如果涉及到LINQ,我是新手,所以我无法理解查询的其余部分。