【发布时间】:2015-07-30 14:02:11
【问题描述】:
如果我在我的实体框架结果中对 IQueryable 使用 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 个 Subreddits 将是不同的。但是由于从 Select() 中只获取了 36 个中的 4 个,因此它只能找到 1 个不同的。
那么我可以用 LINQ 表达式做些什么来获取正确的数据,以便 distinct 语句起作用,还是我必须在继续使用 Select 和 Distinct 函数之前将其放入 List 中?
编辑:
通过将 where 语句从末尾移动到整个查询的开头。
它现在似乎可以正常工作。 Select 返回所有 36 个项目等...这反过来又使 Distinct 工作,因为它可以找到超过 1 个唯一值。
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);
}
【问题讨论】:
-
一些模拟数据可能有助于说明您的观点。
-
我建议您放置单独版本的逻辑(或您更改的第二个代码 sn-p)。在需要变化的代码中跟踪 cmets 可能很困难(例如,我无法判断您的示例是否损坏或正常工作)。
-
在调用 distinct 之前进行分页是否有原因?我通常会期望相反的顺序。
标签: c# linq entity-framework