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

5

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

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

返回的结果数量是准确的,但第一个结果会出现多次。当我在SQL管理工具中执行该查询时,返回的结果是正确的。有什么帮助吗?!


2
使用SQL Profiler捕获发送的SQL并发布它。这将告诉您EF误解了什么。 - usr
1
打开 开始菜单 > 所有程序 > Microsoft SQL Server > 性能工具 > SQL 查询分析器 启动分析器,然后执行您的 Linq 查询。分析器将显示在服务器上执行了哪些 SQL。 - Sergey Berezovskiy
2
@lazyberezovsky,我本来想告诉他“去用谷歌”,但你的回答更友善。 - usr
有一天你遇到了同样的问题,你可能会缺少一个键(或者是实体上的“好”键(即使它是一个视图,也必须有一个)。 - Raphaël Althaus
2个回答

6
这通常发生在被指定为主键的列(或列)在视图中没有唯一值时。在你的情况下,ArchiveID 在大量视图行中可能重复出现(这也可以通过你的 where 子句来指示)。你需要找到(或添加到视图中)一组列,以唯一标识一个视图行,并在 EF 模型中将其标记为主键。
请注意,生成的 SQL 查询返回的数据可能包含具有不同值(但相同的 ArchiveID)的行,但 EF 只会为每个 ArchiveID 实例化一个实体对象,并使用它能够找到的第一个结果。

1
注意:如果您无法指定其他键(例如,对于您仅具有只读访问权限或其他原因而不管理的数据表),则可以在查询中选择各个列作为解决方法。
var x = from fields in entities2.archiveContentPreviews
                where fields.ArchiveID == archiveID
                select new {fields.col1, fields.col2};
        return x.ToList<archiveContentPreview>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接