在 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 中批量删除

LINQ to Entities 中仅支持无参数构造函数和初始化程序

LINQ to Entities 为实体的子级返回错误的 ID

Linq to Entities - 3 层架构