林克:帮我做这个工作

时间:2017-07-07 14:10:59

标签: c# .net entity-framework linq

我有这个专栏:

    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

的情况下看到这样做的方法

6 个答案:

答案 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)

以下情况可以,但您应该知道存储数据的方式很奇怪。

(我的意思是,并非所有与类别相关的子类别?)

{{1}}

已关联dotnetfiddle

答案 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替换为单字段版本。