2015-05-18 54 views
10

如果我在IQueryable上使用Select對我的實體框架結果,我將得到4項作爲結果。IQueryable <T>給出與列表不同的結果<T>

如果我在IQueryable.ToList()上使用Select,則獲得全部36個項目。

這裏是函數的代碼:

public ImagesGetModelView Get(int start, int count) 
{ 
    if (count <= 0) count = 9; 
    else if (count > ImageHandler.MaxResult) count = ImageHandler.MaxResult;  

     IQueryable<Image> imagesList = ImagesHandler.FetchRangeScore(start, count) 
      .Where(m => m.Domain == Database.Enums.ImageDomain.Gfycat); 

     //Works using list :(
     //var list = imagesList.ToList(); 

     //Select all subreddits once 
     //Returns 4 instead of 36 if not using the list ... 
     //Returns 1 instead of 2 with Distinct() if not using the list 
     IEnumerable<Subreddit> subreddits = imagesList 
      .Select(m => m.Subreddit); //.Distinct();   

     ImagesGetModelView result = new ImagesGetModelView() 
     { 
      Items = imagesList, 
      Subreddits = subreddits 
     }; 

     return result; 
    } 

public IQueryable<Image> FetchRangeScore(int a_start, int a_count) 
    { 
     return Repository.AllQueryable().OrderByDescending(m => m.Score) 
      .Skip(a_start).Take(a_count); 
    } 

出了36項2個Subreddits將是不同的。但是由於從Select()中只有4個被獲取,所以它只能找到1個不同的值。

因此,有什麼我可以用LINQ表達式來獲得正確的數據,這樣獨特的語句工作,或者我必須在繼續選擇之前將它變爲列表?&獨特的功能?

編輯:
通過將where語句從結尾移動到整個查詢的開始。 它現在似乎正常工作。選擇返回所有36個項目e.t.c ...這反過來使得獨特的工作,因爲它可以找到多個唯一的值。

public IQueryable<Image> FetchRangeScore(int a_start, int a_count) 
    { 
     return Repository.AllQueryable() 
      .Where(m => m.Domain == Database.Enums.ImageDomain.Gfycat) 
      .OrderByDescending(m => m.Score) 
      .Skip(a_start).Take(a_count); 
    } 
+0

有些模擬數據可能有助於說明您的觀點。 – neontapir

+1

我會建議把你的邏輯的單獨版本(或你改變的第二個代碼片段)。在需要改變的代碼中可能很難遵循註釋(例如,我無法判斷您的示例是否損壞或正常工作)。 – Guvante

+1

在你打電話給別人之前,你有沒有分頁的理由?我通常會期望相反的順序。 – Guvante

回答

5

很可能您的Where子句在SQL Server中的行爲與.NET中的行爲不同。具體而言,取決於您的整理設置等,很可能各種值僅在大寫等方面存在差異,從而使其與SQL中的Gfycat「等於」,而不是C#中的Gfycat。

您可以在IQueryable<>上捕獲.ToString()以查看正在生成的SQL並自行嘗試。

IQueryable<Image> imagesList = ImagesHandler.FetchRangeScore(start, count) 
    .Where(m => m.Domain == Database.Enums.ImageDomain.Gfycat); 
Debug.WriteLine(imagesList.ToString()); 
+0

我相信你是對的。你讓我意識到我有一個在那裏的聲明:)我很久以前添加它進行測試,並對此失明。當你觀察它時,它的位置非常貼切,但是數據集是36個1的36個子集,所以我從來沒有注意到它是錯誤的,直到昨晚。 當我將它移動到查詢的開始時,我注意到Debug.WriteLine()不再返回子查詢,並且一切似乎都正常工作。 –

5

是很困難的是沒有源數據肯定的,但是,當推到SQL Distinct工作方式不同。

SQL DISTINCT查詢將拉出所有值不同的記錄。當您在內存中的對象列表上調用Distinct時,默認情況下它將使用實例等式。因此,您可能會收回「重複」對象(所有字段值相同的對象),但它們將是不同的「實例」,因此Distinct將它們視爲不同的對象。

所以這取決於你想要什麼 - 你希望所有Subreddit包括重複還是要明顯

要回答你的問題 - 如果你不想Distinct呼叫傳下來的,你可以撥打AsEnumerable()代替ToList,這使得所有進一步的LINQ的SQL查詢的LINQ到對象(IEnumerable<T>)查詢,而不是Linq-到{whatever}(IQueryable<T>)查詢,而無需將項目放入列表中。

+0

我只想要不同的值不重複。我需要明顯分離結果的子衝突。 –

相關問題