【问题标题】:related entities included only intermittently in Entity Framework query相关实体仅间歇性地包含在实体框架查询中
【发布时间】:2015-05-11 21:26:30
【问题描述】:

我有一个实体框架查询,其中根据一组可变的用户定义标准显示项目。最终查询应该包括相关实体“主题”,但只是间歇性地这样做。也就是说,在同一个结果集中,一些结果将包括他们的主题,而另一些则不会。更奇怪的是,同一记录“a”将在一个请求中包含其相关主题,但在另一个请求中不包含,即使我在两种情况下都使用相同的选择代码。这是最终选择的相关sn-p:

 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

            }

为了清楚起见,我删除了一堆额外的字段和其他相关实体。

更新:为了进一步澄清,我可以运行完全相同的查询并让主题第一次出现在特定记录中,然后什么都没有出现.所以我不认为它与数据有关。

【问题讨论】:

  • 能否提供样本和数据值。
  • 我相信“间歇性”时尚将与主题的客户端 id 等于当前数据对象的 id 并且查询的主键等于主题的主键的主题完全相关,并且在哪里主题仍然活跃。
  • 试图弄清楚如何做到这一点并仍然尊重我的 NDA...
  • Travis - 尝试遵循您的建议,并意识到我对代码的编辑使事情变得不太清楚。修复了 ID 名称以使事情更清晰......我希望。
  • @acullen72 - 我的评论也有点模糊。我的观点是,用于选择您使用的主题的 Where 子句可能是为什么有些被加载而有些没有。 l.RecordSubjects.Where(s => s.Subject.ClientId == data.ClientId && l.RecordId == s.RecordId && s.IsActive)

标签: c# entity-framework


【解决方案1】:

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

更新

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

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

【讨论】:

  • 对结果查询的任何枚举也应该枚举可枚举的主题。我不确定这会解决“间歇性”观察。
  • @TravisJ,好点子。 acullen72 您是在枚举结果,还是在检查存在某些对象的未枚举结果,因为 EF 的 dbContext 已经有了它们?
  • data.ClientId 是传递给方法的参数。此外,添加“ToList()”得到以下错误:{“LINQ to Entities 无法识别方法'System.Collections.Generic.List1[<>f__AnonymousType03[System.String,System.Int32,System.String]] ToList[f__AnonymousType03](System.Collections.Generic.IEnumerable1[f__AnonymousType0`3[System.String,System.Int32,System.String]])' 方法,并且该方法不能翻译成存储表达式。"}
  • @acullen72,要删除我的答案,因为它不是答案。但是,在我这样做之前,只是想问一下当您执行 var list = newQuery.ToList(); 时会发生什么
  • 我想请你把它留在这里,因为它提出了一些有价值的问题。现在在查询结束时检查 ToList()。它运行了,但我还没有确认问题是否仍然存在......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多