TSQL需要独特的结果集,但我得到了重复的值

时间:2012-03-19 15:19:38

标签: c# entity-framework

以下代码出于某种奇怪的原因为我提供了表中每一行的值。我只想要独特的价值观:

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]

4 个答案:

答案 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)

您有两种选择:

  1. 使用GroupBy并保留SQL端的所有内容(首选)。您可以根据您感兴趣的属性进行分组,为您定义唯一性。
  2. 使用AsEnumerable关闭所有内容,然后使用接受IEqualityComparer的{​​{3}}。这通常不是一个好主意(除非结果集很小),因为返回了所有匹配结果,并且在SQL端进行的处理较少。
  3. 实现第一个解决方案如下所示:

    var results = _db.WasteIndicatorItems
                     .OrderBy(x => x.EWC)
                     .GroupBy(x => x.EWC)
                     .Select(x => x.First());