我在数据库中定义了一个视图(archiveContentPreviews),它将几个表连接在一起,在Linq中它有一个实体键(ArchiveID),我想用这个简单的查询查询这个视图:
var x = from fields in entities2.archiveContentPreviews
where fields.ArchiveID == archiveID
select fields;
return x.ToList<archiveContentPreview>();
它返回确切的结果数但是第一个结果的多个副本的问题,当我在SQL管理工作室中执行该查询时,它返回正确的结果,任何帮助?!
答案 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>();