Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#LINQ Distinct和ADO.NET EF_C#_Linq_Entity Framework - Fatal编程技术网

C#LINQ Distinct和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或其他方式实现。我(作为新手)的想法是,这似乎是一项相当标准的工作,不需要实现或重写现有方法,正如我在不

我使用ADO.NET EF和代码优先的方法。我正在使用:

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
内部使用的映射属性。