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());