C# 需要TSQL Distinct unique结果集,但我得到重复的值

C# 需要TSQL Distinct unique结果集,但我得到重复的值,c#,entity-framework,C#,Entity Framework,出于某种奇怪的原因,下面的代码为表中的每一行提供了一个值。我只想要唯一的值: public IQueryable<WasteIndicatorItem> FindAllEWC() { var results = (from x in this._db.WasteIndicatorItems orderby x.EWC select x).ToList(); return results

出于某种奇怪的原因,下面的代码为表中的每一行提供了一个值。我只想要唯一的值:

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();
}
而不是:

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]

您正在将Distinct应用于List,而不是EF DBSet。确保列表中的每个条目都是唯一的,除非您定义了IEquatable实现。 所以,如果您想在客户端丢弃重复项,您必须为数据对象实现IEquatable,或者您可以在查询中使用分组。

Linq Distinct()可以

您需要创建一个相等比较器,并在Union或Distinct()中使用它


或者试着从

中区分出来,您希望这些项目在哪些方面是不同的?默认情况下-假设您在使用
ToList()
将结果具体化并移回Linq to Objects之前调用
Distinct()
-我假设实体框架将查看
wasteIndicationItemId
,它是您的主键,根据定义是唯一的,因此,您的
Distinct
调用不会改变任何内容(甚至可能会被优化掉)。

您有两个选择:

  • 使用
    GroupBy
    并将所有内容保留在SQL端(首选)。您可以按您感兴趣的属性进行分组,该属性定义了您的唯一性
  • 使用将所有内容记录下来,然后使用接受
    IEqualityComparer
    的。这通常不是一个好主意(除非结果集很小),因为会返回所有匹配的结果,并且在SQL端执行的处理较少
  • 实施第一个解决方案如下所示:

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

    这个代码块给我相同的结果集,我调试,结果包含许多行相同的重复数据。我认为需要分组讨论,有什么想法吗?感谢查看链接中的“重载独特方法”示例,看起来我需要编写一个类。必须使用单行方式从此对象中删除重复数据。我所需要的似乎很复杂。谢谢,但是你能再多给我一点建议吗thanks@John您在问题中发布的值是
    EWC
    值吗?我使用的ID无论如何都是唯一的,因此您需要使用希望具有不同值的属性/列。我怀疑可能是
    EWC
    ,所以改用
    GroupBy(x=>x.EWC)
    (我已经更新了答案)。另外,
    GroupBy
    方法绕过了编写
    IEqualityComparer
    类的需要。
    var results = _db.WasteIndicatorItems
                     .OrderBy(x => x.EWC)
                     .GroupBy(x => x.EWC)
                     .Select(x => x.First());