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...

C# LINQ Distinct and ADO.NET EF

您可以通过分组实现:

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

然而,这有一个缺点,它将首先从数据库中获取所有行到应用程序的内存中,并在那里执行分组。

你必须决定选择哪种解决方案。正如我所展示的,两者都有缺点。