C#LINQ Distinct和ADO.NET EF

时间:2013-03-21 13:00:10

标签: c# linq entity-framework

我正在使用ADO.NET EF和Code First方法。我正在使用:

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

1 个答案:

答案 0 :(得分:3)

您可以通过分组来实现这一目标:

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

但是,它的缺点是它首先将所有行从数据库中提取到应用程序的内存中并在那里执行分组。

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