C#LINQ Distinct和ADO.NET EF
我使用ADO.NET EF和代码优先的方法。我正在使用:C#LINQ Distinct和ADO.NET EF,c#,linq,entity-framework,C#,Linq,Entity Framework,我使用ADO.NET EF和代码优先的方法。我正在使用: IList<SoleColor> soleColors = SoleColorService.All().ToList(); 由于各种原因不起作用,但仍然-soleColors保存我需要的所有记录/数据。我只需要再多做一步来过滤这些记录/数据,这样我就可以为每个SoleCode只保留一个。我不知道是否可以通过简单的LINQ或其他方式实现。我(作为新手)的想法是,这似乎是一项相当标准的工作,不需要实现或重写现有方法,正如我在不
IList<SoleColor> soleColors = SoleColorService.All().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...
您可以通过分组来实现这一点:
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的替代方案如下所示:
SoleColorService.All()
.AsEnumerable()
.GroupBy(x => x.SoleCode)
.Select(g => g.First())
.ToList();
但是,这样做的缺点是,它会首先将数据库中的所有行提取到应用程序的内存中,并在那里执行分组
您必须决定选择哪种解决方案。如我所示,两者都有缺点。您可以通过分组来实现这一点:
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的替代方案如下所示:
SoleColorService.All()
.AsEnumerable()
.GroupBy(x => x.SoleCode)
.Select(g => g.First())
.ToList();
但是,这样做的缺点是,它会首先将数据库中的所有行提取到应用程序的内存中,并在那里执行分组
您必须决定选择哪种解决方案。正如我所展示的,两者都有缺点。这一点,或者使用自定义的
IEqualityComparer
:)@Trustme-I'maDoctor:由于这将进入数据库,我不愿意使用这种重载。当然,我只是指出有一种可能性。我也会使用您列出的版本,尤其是对于“仅由一个属性进行区分”。指定的类型成员“SoleCode”在LINQ to实体中不受支持。只支持初始值设定项、实体成员和实体导航属性。
可能是因为SoleCode
在我的实体中被标记为[NotMapped](我将用实体代码更新我的代码),在这个casa中我应该做什么?@Leron:是的,NotMapped
是原因。在这种情况下,您必须从数据库中传输所有内容,并在内存中执行分组。您可以通过在.GroupBy
之前添加.AsEnumerable()
来实现这一点。或者,您可以使用SoleCode
内部使用的映射属性。该属性或Distinct
与自定义IEqualityComparer
:)@Trustme-I'maDoctor:由于这将进入数据库,我不愿意使用这种重载。当然,我只是指出有一种可能性。我也会使用您列出的版本,尤其是对于“仅由一个属性进行区分”。指定的类型成员“SoleCode”在LINQ to实体中不受支持。只支持初始值设定项、实体成员和实体导航属性。
可能是因为SoleCode
在我的实体中被标记为[NotMapped](我将用实体代码更新我的代码),在这个casa中我应该做什么?@Leron:是的,NotMapped
是原因。在这种情况下,您必须从数据库中传输所有内容,并在内存中执行分组。您可以通过在.GroupBy
之前添加.AsEnumerable()
来实现这一点。或者,您可以使用SoleCode
内部使用的映射属性。