我有这个专栏:
PersonId CategoryId SubCategoryId
1 61 47
2 61 48
3 61 0 424
4 61 0 425
5 84 55
6 61 585
7 101 48
8 101 424
8 666 47
10 666 424
当我只搜索categoryId时它很好,而subCategoryId很好,但当我搜索两者时,例如categoryId = 47&& subCategoryId = 424。 我不能让它工作......在这种情况下,我只需要61号人和666人。
我可以做一个foreach,但不是一个好主意。
你们可以帮帮我吗?if (ids.IdCategory != null && ids.IdSubCategory != null)
{
query = unitOfWork.PersonSkillsRepository.GetAll().Where(m => m.IdCategory == ids.IdCategory || m.IdSubCategory == ids.IdSubCategory);
}
else if (ids.IdCategory != null)
query = unitOfWork.PersonSkillsRepository.GetAll().Where(m => m.IdCategory == ids.IdCategory);
else
query = unitOfWork.PersonSkillsRepository.GetAll().Where(m => m.IdSubCategory == ids.IdSubCategory);
第一种情况我得到了我想要的一半...但我想要一些方法来过滤,因为这样我也得到101而且我不知道如何看看人们是否同时具有类别和子类别
我无法在没有foreach
的情况下看到这样做的方法答案 0 :(得分:1)
您应该按人员ID对所有人技能进行分组,然后只选择那些包含给定类别和子类别的组:
unitOfWork.PersonSkillsRepository.GetAll()
.GroupBy(p => p.PersonId)
.Where(g => g.Any(p => p.IdCategory == ids.IdCategory)
&& g.Any(p => p.IdSubCategory == ids.IdSubCategory))
.Select(g => g.Key)
为了优化,您可以在分组之前过滤掉与任何给定类别不匹配的技能。
unitOfWork.PersonSkillsRepository.GetAll()
.Where(p => p.IdCategory == ids.IdCategory
|| p.IdSubCategory == ids.IdSubCategory)
.GroupBy(p => p.PersonId)
.Where(g => g.Any(p => p.IdCategory == ids.IdCategory)
&& g.Any(p => p.IdSubCategory == ids.IdSubCategory))
.Select(g => g.Key)
答案 1 :(得分:0)
entities.Where(z => z.categoryId == 47 || z.subCategoryId == 424)
.GroupBy(z => z.personId)
.Where(z => z.Count() == 2)
.SelectMany(z => z.ToList());
可能会为您提供所需的数据。
该查询显示'过滤数据并仅返回categoryId
为47 或 subCategoryId
= 424'的数据。然后它将它们组合在一起并检查它们中有两个(即categoryId
的一行和subCategoryId
的一行)。
答案 2 :(得分:0)
I just Showed the data of yours in Image
问题是你在SubCategoryId列中对CategoryId = 47没有任何值,这就是为什么当你一起搜索它们时它什么也没有给出。 通过在SubCategoryId中添加任何值来对CategoryId = 47 ...
进行尝试答案 3 :(得分:0)
编辑:
在问题更加明确之后,以下代码应该有效
if (ids.IdCategory != null && ids.IdSubCategory != null)
{
query = unitOfWork.PersonSkillsRepository.GetAll().Where(m => (m.IdCategory == ids.IdCategory || m.IdSubCategory == ids.IdSubCategory) && m.IdPerson != 101);
}
首先,您的数据将针对您的搜索条件返回null。以下是linq的一些示例,可能有助于此方案。
你可以做不同类型的linq。
List<CollectionObject> ColObj = CollectionObject.GetListCollectionObj();
List<CollectionObject> LinqResult = ColObj.Where(x => x.CategoryID == 47 && x.SubcategoryID == null).ToList();
以下代码适用于上面的linq语句。
class CollectionObject
{
public int PersonID { get; set; }
public int? CategoryID { get; set; }
public int? SubcategoryID { get; set; }
public static List<CollectionObject> GetListCollectionObj()
{
List<CollectionObject> LColObj = new List<CollectionObject>();
LColObj.Add(new CollectionObject() { PersonID = 61, CategoryID = 47, SubcategoryID = null });
LColObj.Add(new CollectionObject() { PersonID = 61, CategoryID = 48, SubcategoryID = null });
LColObj.Add(new CollectionObject() { PersonID = 61, CategoryID = 0, SubcategoryID = 424 });
LColObj.Add(new CollectionObject() { PersonID = 61, CategoryID = 0, SubcategoryID = 425 });
LColObj.Add(new CollectionObject() { PersonID = 101, CategoryID = 48, SubcategoryID = null });
LColObj.Add(new CollectionObject() { PersonID = 101, CategoryID = null, SubcategoryID = 424 });
LColObj.Add(new CollectionObject() { PersonID = 666, CategoryID = 47, SubcategoryID = null });
LColObj.Add(new CollectionObject() { PersonID = 666, CategoryID = null, SubcategoryID = 424 });
return LColObj;
}
}
答案 4 :(得分:0)
答案 5 :(得分:0)
好吧,当我在我的工作时,似乎其他3个人想出了同样的东西,所以我会投入我的 - 带有OP需要的关键补充....
Func<IGrouping<int, CollectionObject>, bool> query =
gp=>
gp.Any(g=>g.CategoryID == 47) &&
gp.Any(g=>g.SubcategoryID == 424);
var q = (from p in ColObj
group p by p.PersonID)
.Where(query);
您有时需要将query
替换为单字段版本。