在 LINQ to Entities 中有 10 个不同的对象之前,如何跳过和获取对象?
Posted
技术标签:
【中文标题】在 LINQ to Entities 中有 10 个不同的对象之前,如何跳过和获取对象?【英文标题】:How can I Skip and Take objects until I have 10 distinct ones in LINQ to Entities? 【发布时间】:2014-12-03 07:37:09 【问题描述】:这是有问题的代码:
var distinctCatNames = allCats.Select(c => c.CatName).Distinct();
if (skip.HasValue) distinctCatNames = distinctCatNames .Skip(skip.Value);
if (take.HasValue) distinctCatNames = distinctCatNames .Take(take.Value);
var distinctCatNameList= distinctCatNames .ToList();
如果您想象我有一个包含 100 只猫的列表,我想选择 10 个不同的名字。它进入了一个分页列表,所以它必须使用skip and take。
以上行不通,因为必须用 OrderBy 来订购。
如果我将 OrderBy 放在 distinct 之后,我不能执行 Skip and Take,因为结果是 IOrderedQueryable,而不是 IQueryable(编译器错误)。
如果我以前这样做,错误会显示DbSortClause expressions must have a type that is order comparable.
我需要确保它在后台正确地翻译了我的查询,因为可能有很多猫,所以我想确保它生成的 SQL 将跳过/获取包含在查询中,而不是获取所有猫然后在那个集合上做。
有什么想法吗?
【问题讨论】:
LINQ to SQL does not generate ORDER BY when DISTINCT is used?的可能重复 【参考方案1】:您需要订购商品,然后只需将存储它的变量键入为IQueryable
,而不是IOrderedQueryable
:
var distinctCatNames = allCats.Select(c => c.CatName)
.Distinct()
.OrderBy(name => name)
.AsQueryable();
【讨论】:
<facepalm>
。希望实体的 linq 不会对转换产生影响,并且仍然可以很好地工作。谢谢。
嗯,同样的错误DbSortClause expressions must have a type that is order comparable.
@SLC CatName
的类型是什么?有人会认为,作为一个名字,它会是一个字符串。显然不是。
是的。我认为这是实体问题的 linq,我怀疑它不喜欢尝试跳过并接受有序的字符串列表。
确实如此。我已将逻辑更改为此,它似乎可以工作,所以AsQueryable
可能存在问题:allCats.Select(c => c.CatName).Distinct().OrderBy(c => c).Select(c => c);
以上是关于在 LINQ to Entities 中有 10 个不同的对象之前,如何跳过和获取对象?的主要内容,如果未能解决你的问题,请参考以下文章
在实体框架和 Linq to Entities 中使用规范模式和表达式
C# LINQ to Entities 无法识别方法“布尔”
LINQ to Entities 中仅支持无参数构造函数和初始化程序