如果我在Entity Framework的查询结果上使用Select,那么结果将会有4个项目。
如果我在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个子版面是不同的。但由于只有从Select()中获取了其中的4个,因此只找到了1个不同的。
那么是否可以通过LINQ表达式来获取正确的数据,使Distinct语句起作用,还是必须在继续使用Select和Distinct函数之前将其转换为List?
编辑:
通过将where语句从整个查询的末尾移动到开头。
现在似乎可以正常工作了。Select返回所有36个项目等...这反过来使Distinct工作,因为它可以找到不止一个唯一值。
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);
}