2013-02-26 158 views
2

早些時候,我把question on Stackoverflow關於如何根據每個對象中的特定屬性刪除對象列表中的重複記錄。Linq To Entities Optional Distinct

我得到了我一直在尋找(見下文)的答案,一個查詢返回使用MainHeadingID作爲屬性刪除重複對象的一個獨特的列表

public IList<tblcours> GetAllCoursesByOrgID(int id) 
{ 
    return _UoW.tblcoursRepo.All. 
     Where(c => c.tblCourseCategoryLinks.Any(cl => cl.tblUnitCategory.tblUnit.ParentID == id)) 
     .GroupBy(c => c.MainHeadingID) 
     .Select(g => g.FirstOrDefault()) 
     .ToList(); 
} 

但是,現在我需要更多的幫助!無論如何修改上面的查詢,以便當MainHeadingID不等於180時僅刪除重複值。我嘗試修改GroupBy行爲

.GroupBy(c => c.MainHeadingID != 180) 

但是,這並沒有奏效。

任何幫助將非常讚賞與此。

謝謝。

回答

2

繼作品LINQ到SQL:

return _UoW.tblcoursRepo.All 
    .Where(c => c.tblCourseCategoryLinks.Any(cl => cl.tblUnitCategory.tblUnit.ParentID == id)) 
    .GroupBy(c => c.MainHeadingID) 
    //.SelectMany(g => g.Key == 180 ? g : g.Take(1)) 
    .SelectMany(g => g.Take(g.Key == 180 ? Int32.MaxValue : 1)) 
    .ToList(); 

評論:SelectMany在上面的查詢選擇從哪裏MainHeadingID等於180組中的所有項目,但只需要一個項目表單其他羣體(即不同的結果)。 Linq to SQL不能翻譯註釋掉的部分,但是感謝@usr有辦法解決。


Linq to Entities無法翻譯甚至簡化的查詢。我認爲,在這種情況下,你唯一的選擇是兩個查詢的簡單concating結果:

Expression<Func<tblcours, bool>> predicate = x => 
    x.tblCourseCategoryLinks.Any(cl => cl.tblUnitCategory.tblUnit.ParentID == id) 
int headingId = 180; 

return _UoW.tblcoursRepo.All 
    .Where(c => c.MainHeadingID != headingId) 
    .Where(predicate) 
    .GroupBy(c => c.MainHeadingID) 
    .Select(g => g.FirstOrDefault()) 
    .Concat(_UoW.tblcoursRepo.All 
       .Where(c => c.MainHeadingID == headingId) 
       .Where(predicate)) 
    .ToList(); 
+0

這看起來不錯,但我得到運行時錯誤,無法從指定的'Then'表達式的ResultTypes中推斷出有效的ResultType。有任何想法嗎? – tgriffiths 2013-02-26 14:04:32

+0

@tgriffiths堅持,我會驗證 – 2013-02-26 14:08:54

+0

感謝您的幫助 – tgriffiths 2013-02-26 14:10:24

2

lazyberezovsky的回答未能由於EF錯誤(給定EF的LINQ支持的質量,這並不奇怪)。它可以用做一個黑客的工作:

.SelectMany(g => g.Key == 180 ? g.Take(int.MaxValue) : g.Take(1)) 

.SelectMany(g => g.Take(g.Key == 180 ? int.MaxValue : 1)) 

注意,表現不會特別好,由於這個被翻譯成SQL的方式。

+1

+1來自我!有時候簡單的東西在EF – 2013-02-26 14:23:03

+0

中不起作用@usr - 感謝您的幫助,但是,當我嘗試使用第一個.SelectMany時,出現以下錯誤不支持嵌套查詢。 Operation1 ='Case'Operation2 ='收集'。當我嘗試第二個.SelectMany時,我得到Limit必須是一個DbConstantExpression或一個DbParameterReferenceExpression。 參數名稱:限制。請幫忙。 – tgriffiths 2013-02-26 14:24:45

+0

好的,在這種情況下,我屈服於EF缺乏特徵。我建議你在內存中執行查詢,就像lazyberezovsky已經提出的那樣。那時性能可能會更糟糕。 – usr 2013-02-26 14:26:14