繁体   English   中英

LINQ - 按不同字段排序和区分。 跳过并采用不同的值

[英]LINQ - Order By and Distinct by different fields. Skip & Take distinct values

我想ORDER BY一些字段,但SELECT DISTINCT另一场,之后应用Skip & Take

代码:

var result = entities.OrderBy(e => e.OrderField)
                     .Select(e => e.SelectField)
                     .Distinct()
                     .Skip(skip)
                     .Take(take)
                     .ToArray();

但我得到这个例外:

System.NotSupportedException: ''Skip' 方法仅支持 LINQ to Entities 中的排序输入。 方法 'OrderBy' 必须在方法 'Skip' 之前调用。

我理解原因(该集合在排序和跳过之间发生了变化)但是我可以在不多次查询数据库的情况下解决这个问题吗(编辑:并且不获取比预期更多的实体)?

编辑:我认为没有最佳解决方案,所以我所做的是获取值然后对它们进行分页。 *叹*

var result = entities.OrderBy(e => e.OrderField)
                     .Select(e => e.SelectField)
                     .Distinct()
                     .ToArray()
                     .Skip(skip)
                     .Take(take)
                     .ToArray();

您应该在Skip之前添加.OrderBy(e => e)

var result = entities.OrderBy(e => e.OrderField)
                 .Select(e => e.SelectField)
                 .Distinct()
                 .OrderBy(e => e)
                 .Skip(skip)
                 .Take(take)
                 .ToArray();

阅读以下帖子以更好地理解

方法 'Skip' 仅支持 LINQ to Entities 中的排序输入

编辑:根据评论更新。 以下代码应该适用于您的情况:

var result = entities
            .OrderBy(e => e.OrderField)
            .Select(e => e.SelectField)
            .GroupBy(e => e)
            .Select(group => group.Key)
            .Skip(skip)
            .Take(take)
            .ToArray();

您可以从数据库中获取Distinct值,然后像这样在内存中工作:

var result = entities.OrderBy(e => e.OrderField)
                     .Select(e => e.SelectField)
                     .Distinct()
                     .ToArray()
                     .Skip(skip)
                     .Take(take)
                     .ToArray();

您将根据需要查询一次

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM