如果我在我的实体框架结果上使用Select on IQueryable,结果将得到4项.
如果我使用Select on IQueryable.ToList(),我得到所有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将是不同的.但是,由于只有4个中的36个是从Select()中获取的,所以它只发现1个不同的.
那么有什么我可以用LINQ表达式来获取正确的数据,所以不同的语句是有效的,或者我必须把它变成一个列表,然后继续选择&独特的功能?
编辑:
通过将整个查询的结尾移动到开始的位置.
它似乎现在正常工作.选择返回所有36个项目e.t.c …这反过来使得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); }
解决方法
sql Server中的Where子句很可能与.NET不同.具体来说,根据你的排序规则设置等等,很可能各种不同的值不同,大小写或者类似的东西不同,使得它们在sql中与Gfycat“相等”,而不是在C#中.
您可以捕获您的IQueryable<>上的.ToString()查看正在生成的sql,并自己尝试.
IQueryable<Image> imagesList = ImagesHandler.FetchRangescore(start,count) .Where(m => m.Domain == Database.Enums.ImageDomain.Gfycat); Debug.WriteLine(imagesList.ToString());
原文地址:https://www.jb51.cc/csharp/95896.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。