如果我在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);
}
有些模擬數據可能有助於說明您的觀點。 – neontapir
我會建議把你的邏輯的單獨版本(或你改變的第二個代碼片段)。在需要改變的代碼中可能很難遵循註釋(例如,我無法判斷您的示例是否損壞或正常工作)。 – Guvante
在你打電話給別人之前,你有沒有分頁的理由?我通常會期望相反的順序。 – Guvante