C# 实体框架查询中仅间歇包含相关实体

C# 实体框架查询中仅间歇包含相关实体,c#,entity-framework,C#,Entity Framework,我有一个实体框架查询,其中根据一组可变的用户定义条件显示项目。最终的查询应该包括相关的实体“Subjects”,但只是以间歇的方式进行。也就是说,在同一个结果集中,一些结果将包含他们的主题,而另一些结果将不包含。更奇怪的是,同一条记录“a”将在一个请求中包含其相关主题,但在另一个请求中不包含,尽管我在这两种情况下使用的选择代码相同。以下是最终选择的相关片段: var newQuery = query.Select(l => new {

我有一个实体框架查询,其中根据一组可变的用户定义条件显示项目。最终的查询应该包括相关的实体“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

            }
为了清晰起见,我删除了一些额外的字段和其他相关实体


更新:为了进一步澄清,我可以运行相同的精确查询,让主题在第一次出现在特定记录中,而在下一次没有显示任何内容。因此,我不认为这与数据有关。

尝试在
选择之前抛出一个
.AsEnumerable()。
,即
查询.AsEnumerable()。选择(
这将强制检索所有所需的数据,而不是让它处于延迟加载状态。例如,可能一些
主题
实体已由EF加载并存在,而其他实体不存在,但将根据需要延迟加载,这可能是您获得这种间歇性行为的原因。执行
操作>.AsEnumerable()
强制从数据库加载
主题
实体的所有结果。当然,这可能会导致性能开销,这对于您的用例来说是不可接受的

更新

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

更新2
正如@TravisJ在下面的评论中所暗示的那样,我的回答不太可能是正确的或完全正确的,因为@acullen72的情况。但是,@acullen72要求博士后暂时不要发表评论。

你能提供样本和数据值吗?我相信“间歇性的”时尚将与主题的客户端id等于当前数据对象的id,查询的主键等于主题的主键,并且主题仍然处于活动状态的主题完全相关。尝试找出如何做到这一点,并仍然遵守我的NDA…Travis-尝试按照您的建议,实现我的edi对代码的修改使事情变得不那么清楚。修复了Id名称以使事情更清楚……我希望如此。@acullen72-我的评论也有点模糊。我的观点是,用于选择您使用的主题的Where子句可能是一些被加载而另一些没有加载的原因。
l.RecordSubjects.Where(s=>s.Subject.ClientId==data.ClientId&&l.RecordId==s.RecordId&&s.IsActive)
结果查询的任何枚举也应枚举可枚举的主题。我不确定这是否会解决“间歇性”问题观察结果。@TravisJ,说得好。acullen72您是在枚举结果,还是在检查存在某些对象的未枚举结果,因为EF的dbContext已经有这些结果?data.ClientId是传递给该方法的参数。另外,添加“ToList()”会导致以下错误:{“LINQ to实体无法识别方法'System.Collections.Generic.List
1[f_uAnonymousType03[System.String,System.Int32,System.String]]ToList[f_uAnonymousType0
3](System.Collections.Generic.IEnumerable
1[f_uAnonymousType0`3[System.String,System.Int32,System.String]))'方法,并且此方法无法转换为存储表达式。}@acullen72,将删除我的答案,因为它不是答案。但是,在我这样做之前,我只想问一下当您执行var list=newQuery.ToList()时会发生什么;我想请您将此保留在这里,因为它会询问一些有价值的问题。检查ToList()现在在查询的末尾。它正在运行,但我还没有确认问题是否仍然存在。。。