2017-07-07 58 views
-6

我有此列:當我只爲的categoryId其精細搜索的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 

,並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

+1

請提供一些您嘗試過的代碼。 – Compufreak

+0

Linq的性能與你的foreach循環一樣,當你不那麼亂。它在內部遍歷IEnumerable。 –

+0

有很多以這種方式工作的網站 - 您提出了一些要求,並有人爲您實施這些要求(可能是爲了一些錢)。但是StackOverflow以不同的方式工作 - 你**嘗試自己實現需求,如果你有一些問題(錯誤或意外結果),那麼你給**問題描述**,你當前的**代碼**並要求人們來幫助你。 –

回答

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) 
+0

我會盡力,謝謝 –

+0

因爲這個問題被標記爲實體框架「優化」可能只會使生成的查詢複雜化,而不會帶來任何性能增益。 – Magnus

+0

@Magnus依賴'GetAll()'返回類型。通常它是已從數據庫中提取的'IEnumerable '。在分組之前過濾大部分記錄將加快分組並節省一些內存,同時檢查g.Any是否會隨着大組大小增加 –

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的一行)。

+0

我這樣做,這樣101也來了,我想這兩個requeriment –

+0

是的,那我的問題的人...我試着去101的方式不來,某種過濾器,組...我不知道 –

+0

我已更新我的代碼。 – mjwills

0

I just Showed the data of yours in Image

的問題是,你沒有在列SubCategoryId這就是爲什麼當你他們搜索兩者同時它給並不反對類別ID = 47的任意值。 在SubCategoryId增加任何價值對類別ID = 47嘗試...

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; 
    } 
} 
+0

我編輯我的帖子澄清 –

0

下面會做,但你應該知道你的數據存儲方式很奇怪。

(我的意思是,不相關的類別所有的子類別?)

// gets all the Ids of people of category 47 
var personIds = entities 
       .Where(x => x.categoryId == 47) 
       .Select(x => x.PersonId) 
       .Distinct() 
       .ToList(); 
// gets all rows of people of category 47 and subcategory 424 
var result = entities 
      .Where(x => personIds.Contains(x.PersonId) && x.subCategoryId == 424) 
      .ToList(); 

鏈接dotnetfiddle

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