C# Take()返回的元素多于请求的元素

C# Take()返回的元素多于请求的元素,c#,linq,entities,C#,Linq,Entities,我们有一个简单的LINQtoEntities查询,它应该从特定页面返回特定数量的元素。 请求的示例可以是: var query = from r in records orderby r.createdDate descending select new MyObject() { ... }; //Parameters: pageId = 8, countPerPage = 10 List<MyObject>

我们有一个简单的LINQtoEntities查询,它应该从特定页面返回特定数量的元素。 请求的示例可以是:

var query = from r in records
            orderby r.createdDate descending
            select new MyObject()
            { ... };

//Parameters: pageId = 8, countPerPage = 10
List<MyObject> list = query.Skip(pageId * countPerPage).Take(countPerPage);

测试这个答案很困难,因为它取决于您的模式和测试数据等。 但我相信你可能在把IQueryAble结果和IEnumerable结果混为一谈时遇到了问题

记住,在完成foreach或ToList()之前,linq-To-Entities查询实际上不会往返到数据库

我建议先把它分成几部分:

var elementsQuery = from m in entityContext.elements
                    where m.elementSearchText.Contains(filter)
                    orderby m.CreatedDate descending;

var elements = elementsQuery.Skip(pageId * countPerPage).Take(countPerPage)).ToList();
然后建立你的投影

var elementsForWeb = from m in elements
                     select new DataContracts.ElementForWeb()
                     {
                     ...
                     }

这是一个奇怪的问题;这是select语句的完整扩展吗?你能提供任何样本数据吗?这很奇怪。你确定你不是在一个团队中,然后进行拆分,例如在“有领带”类型的场景中?生成的SQL是什么样子的?LINQtoEntities使用Row_Number()进行分页,对吗?如果你有完全相同的日期,可能会发生一些不确定的事情。尝试添加第二列到order by,如键或其他内容,例如:orderby m.CreatedDate descending,m.ElementId。
.ToList()
与其说是生产建议,不如说是调试建议;)这就是我最后做的。然而,这意味着我们要对数据库进行更多的往返(对于结果列表中的每个元素),这实际上可能比传输额外数据的成本更高。是的。可能地有一些非常好的工具可以分析生成的数据库SQL。(这里有一篇好文章)当您循环遍历elementsForWeb时,它将与内存中的列表一起出现。然而,你在投影中所做的查询只有在你完成这一组项目之前才会发生。我接受这个答案,因为它基本上接近我们最终所做的。不过,我正在考虑将此问题发布到Microsoft Connect。
Elements returned: 11
Elements returned: 11
Elements returned: 10
Elements returned: 11
Elements returned: 11
Elements returned: 10
Elements returned: 11
Elements returned: 10
Elements returned: 11
Elements returned: 11
var elementsQuery = from m in entityContext.elements
                    where m.elementSearchText.Contains(filter)
                    orderby m.CreatedDate descending;

var elements = elementsQuery.Skip(pageId * countPerPage).Take(countPerPage)).ToList();
var elementsForWeb = from m in elements
                     select new DataContracts.ElementForWeb()
                     {
                     ...
                     }