0

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

IList<SoleColor> soleColors = SoleColorService.All().ToList();

获取我表中所有记录的SoleColor列表。剩下的就是区分这些结果,因为有这一列 -SoleCode对于表中使用相同的每组记录,我只需要一条记录SoleCode。我浏览了很多关于这个主题的文章,但这是我最后一次尝试找到我认为必须存在的解决方案。明显地

IList<SoleColor> soleColors = SoleColorService.All().Distinct.ToList();

由于各种原因不起作用,但仍然 -soleColors保存我需要的所有记录/数据。我只需要多一步来过滤这些记录/数据,以便我只为每个SoleCode. 我不知道它是否可以通过普通的 LINQ 或其他方式来实现。我认为(作为新手)这似乎是一项非常标准的工作,并且不需要像我在各个地方看到的解决方案那样实施或重写现有方法。

所以 - 有没有标准的方法来做到这一点。如果不是,至少在我看来,这并不罕见,所以我想在这种情况下有一种通用的方法可以处理。

附言

这是与此相关的我的实体的代码:

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

1 回答 1

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

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

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

于 2013-03-21T13:04:04.473 回答