C# LINQ Distinct and ADO.NET EF
本文关键字:NET EF ADO and LINQ Distinct | 更新日期: 2023-09-27 18:05:11
我正在使用ADO。NET EF的代码优先方法。我正在使用:
IList<SoleColor> soleColors = SoleColorService.All().ToList();
获取SoleColor
表中所有记录的列表。剩下的是区分这些结果,因为有这个列- SoleCode
,我只需要一个记录在表中使用相同的SoleCode
的每组记录。我读了很多关于这个话题的文章,但这是我最后一次尝试找到我认为一定存在的解决方案。显然
IList<SoleColor> soleColors = SoleColorService.All().Distinct.ToList();
不工作的各种原因,但仍然- soleColors
持有我需要的所有记录/数据。我只需要再多一步来过滤这些记录/数据,以便每个SoleCode
只保留一个。我不知道它是否可以实现与普通LINQ或其他方式。我认为(作为新手),这似乎是一个相当标准的工作,不应该有必要实现或重写现有的方法,因为我看到一个解决方案在不同的地方。
那么,是否有一个标准的方法来做到这一点。如果没有,至少在我看来,这不是什么罕见的事情,所以我想在这种情况下有一个共同的方法来处理。
p。S
下面是我的实体相关的代码:
public class SoleColor : Entity
{
[Required]
public long SoleID { get; set; }
public virtual Sole Sole { get; set; }
//Some code..
[NotMapped]
public string SoleCode
{
get
{
if (Sole == null)
return string.Empty;
return Sole.Code;
}
}
//Some code...
您可以通过分组实现:
SoleColorService.All()
.GroupBy(x => x.SoleCode)
.Select(g => g.First())
.ToList();
OP编辑后更新:
由于SoleCode
没有被映射,您将不得不使用以下代码:
SoleColorService.All()
.GroupBy(x => x.Sole == null ? string.Empty : x.Sole.Code)
.Select(g => g.First())
.ToList();
这基本上重复了查询中SoleCode
属性的代码。这并不干净,因为它违反了DRY。
一个不违反DRY的替代方案如下:
SoleColorService.All()
.AsEnumerable()
.GroupBy(x => x.SoleCode)
.Select(g => g.First())
.ToList();
然而,这有一个缺点,它将首先从数据库中获取所有行到应用程序的内存中,并在那里执行分组。
你必须决定选择哪种解决方案。正如我所展示的,两者都有缺点。