LINQ Query返回第一个结果的多个副本

时间:2013-02-11 11:10:51

标签: 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.ToList<archiveContentPreview>();

它返回确切的结果数但是第一个结果的多个副本的问题,当我在SQL管理工作室中执行该查询时,它返回正确的结果,任何帮助?!

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

请注意一种解决方法(如果您无法指定其他密钥 - 例如,对于您不管理的数据表而只是只读访问权限等)是选择查询中的各个列。

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