相关实体仅间歇性地包含在实体框架查询

时间:2015-05-11 21:26:30

标签: c# entity-framework

我有一个实体框架查询,其中根据一组用户定义的标准显示项目。最终查询应该包括相关实体" Subjects",但只能以间歇方式进行。也就是说,在相同的结果集中,一些结果将包括他们的主题,而其他结果则不包括。更重要的是,同样的记录" a"将相关主题包括在一个请求中,但不包括在另一个请求中,即使我在两种情况下都使用相同的选择代码。这是最终选择的相关片段:

 var newQuery = query.Select(l => new
            {
                RecordId = l.RecordId,
                RawFileId = l.RawFileId,
                Subjects = l.RecordSubjects.Where(s => s.Subject.ClientId == data.ClientId && l.RecordId == s.RecordId && s.IsActive).Select(s => new { Name = s.Subject.Name, SubjectId = s.Subject.SubjectId, Description = s.Subject.Description }),

                Url = (l.Url == null) ? "#" : l.Url, //make sure all results display a valid Url, even if the field is null
                RegionCode = l.RegionCode ?? "",
                RegionName = l.Region.Name ?? "",
                Year = l.Year

            }

为了清楚起见,我已经淘汰了一堆额外的字段和其他相关实体。

更新:为了进一步说明,我可以运行完全相同的查询并让主题第一次出现在特定记录中,并且没有任何内容显示在下一个。所以它不能成为关于数据的任何东西,我不会想。

1 个答案:

答案 0 :(得分:0)

尝试在.AsEnumerable().之前抛出Select,即query.AsEnumerable().Select(这将强制检索所有必需的数据,而不是让它受到延迟加载。也就是说,也许某些Subject实体可能已经由EF加载并且存在,而其他实体不存在但是将根据需要延迟加载,这可能是您获得此间歇性行为的原因。执行.AsEnumerable()强制从数据库加载Subject实体的所有结果。当然,这可能会导致您的用例无法接受的性能开销。

<强>更新

还想知道data.ClientId是否可能成为问题的一部分。 data不在您发布的示例中。

更新2 正如@TravisJ在下面的评论中暗示的那样,对于@ acullen72的情况,我的答案不太可能正确或完全正确。但是,@ acullen72要求该帖子暂时保持不变。