以下代码出于某种奇怪的原因为我提供了表中每一行的值。我只想要独特的价值观:
public IQueryable<WasteIndicatorItem> FindAllEWC()
{
var results = (from x in this._db.WasteIndicatorItems
orderby x.EWC
select x).ToList();
return results.OrderBy(s => s.EWC).Distinct().AsQueryable();
}
我尝试在ToList ETC之前遍布整个地方移动.Distinct()。我做错了什么一定是简单的事情,欢呼阅读..
所以在我的结果中我得到了:
13
13
13
12345
12345
而不是:
13
12345
表结构是:
CREATE TABLE [dbo].[WasteIndicatorItem](
[WasteIndicatorItemId] [int] IDENTITY(1,1) NOT NULL,
[WasteId] [int] NOT NULL,
[WasteIndicatorId] [int] NOT NULL,
[EWC] [varchar](6) COLLATE Latin1_General_CI_AS NOT NULL,
[WasteHazardCodeId] [int] NOT NULL,
[Quantity] [money] NOT NULL,
[Notes] [varchar](4000) COLLATE Latin1_General_CI_AS NULL,
[EnteredById] [int] NOT NULL,
[Entered] [datetime] NOT NULL,
[LastModifiedById] [int] NULL,
[LastModified] [datetime] NULL,
CONSTRAINT [PK_IndicatorItem] PRIMARY KEY CLUSTERED
(
[WasteIndicatorItemId] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
答案 0 :(得分:1)
您正在将Distinct应用于列表而不是EF DBSet。确保List中的每个条目都是唯一的,除非您已定义IEquatable实现。 因此,如果您希望在客户端丢弃重复项,则必须为数据对象实现IEquatable,或者您可以在查询中使用分组。
答案 1 :(得分:1)
Linq Distinct()not really behave as you might expect。
您需要创建一个相等比较器并在Union或Distinct(see here)
中使用它或者也许从MoreLinq library
尝试DistinctBy答案 2 :(得分:0)
您希望这些项目与众不同?默认情况下 - 假设您在实现结果之前放置Distinct()
调用并使用ToList()
移回Linq到对象 - 我会假设实体框架将查看WasteIndicatorItemId
这是您的主键根据定义,将是唯一的,因此您的Distinct
调用不会更改任何内容(甚至可能会进行优化)。
答案 3 :(得分:0)
您有两种选择:
GroupBy
并保留SQL端的所有内容(首选)。您可以根据您感兴趣的属性进行分组,为您定义唯一性。AsEnumerable
关闭所有内容,然后使用接受IEqualityComparer
的{{3}}。这通常不是一个好主意(除非结果集很小),因为返回了所有匹配结果,并且在SQL端进行的处理较少。实现第一个解决方案如下所示:
var results = _db.WasteIndicatorItems
.OrderBy(x => x.EWC)
.GroupBy(x => x.EWC)
.Select(x => x.First());