C# LINQ查询返回第一个结果的多个副本

C# LINQ查询返回第一个结果的多个副本,c#,sql,sql-server,linq,linq-to-entities,C#,Sql,Sql Server,Linq,Linq To Entities,我在数据库archiveContentPreviews中定义了一个视图,它将多个表连接在一起,在Linq中它有一个实体键ArchiveID,我想通过以下简单查询查询此视图: var x = from fields in entities2.archiveContentPreviews where fields.ArchiveID == archiveID select fields; return x

我在数据库archiveContentPreviews中定义了一个视图,它将多个表连接在一起,在Linq中它有一个实体键ArchiveID,我想通过以下简单查询查询此视图:

        var x = from fields in entities2.archiveContentPreviews
                where fields.ArchiveID == archiveID
                select fields;
        return x.ToList<archiveContentPreview>();

问题是,它返回的结果数量准确,但第一个结果有多个副本,当我在SQL management studio中执行该查询时,它返回的结果正确,有什么帮助吗

当指定为主键的列在视图中没有唯一值时,通常会发生这种情况。在您的例子中,ArchiveID可能在大量视图行中重复,这也由where子句指示。您必须找到或向视图中添加一组列,这些列唯一地标识视图行,并将它们标记为EF模型中的主键


请注意,生成的SQL查询返回的数据可能包含具有不同值但具有相同ArchiveID的行,但是EF只是为每个ArchiveID具体化实体对象,并使用它可以为该id找到的第一个结果。

注意,如果您不能指定其他键(例如,对于您不管理但仅为只读访问的datatable,或者选择查询中的各个列的任何内容),则需要一种变通方法

var x = from fields in entities2.archiveContentPreviews
                where fields.ArchiveID == archiveID
                select new {fields.col1, fields.col2};
        return x.ToList<archiveContentPreview>();

使用SQL事件探查器捕获正在发送的SQL并发布它。它将告诉您EF误解了什么。打开“开始”菜单>所有程序>Microsoft SQL Server>性能工具>SQL查询探查器“开始探查器”,然后执行linq查询。探查器将显示在上执行的SQLserver@lazyberezovsky我真的打算告诉他使用谷歌。你的答案要好得多。有一天,你遇到了同样的问题,你必须在你的实体上丢失一个键或一个好键,即使它是一个视图,它也必须有一个。