2014-09-29 62 views
1

我有以下代码。当我不给参数“当前”和“版本”,所以它只运行第一行,最后的lstFile变量包含文件及其相关作业。如果给出“当前”参数或“版本”参数,文件将返回而不包含相关的作业。但是,由于我在第一步中包含了乔布斯,为什么相关的乔布斯在这个过程中会丢失?LINQ包含通过参数时不包含相关实体

顺便说一下,延迟加载是关闭的,这就是为什么我需要做的包括。

IQueryable<File> filteredFiles = entities.Files.Include("Jobs"); 

if (!String.IsNullOrWhiteSpace(current)) 
{ 
    bool bActive = current == "1" ? true : false; 

    filteredFiles = 
     from f in filteredFiles 
     join j in entities.Jobs 
      on f.IDFile equals j.IDFile 
     where j.Active == bActive 
     select f; 
} 

if (!String.IsNullOrWhiteSpace(version)) 
{ 
    filteredFiles = 
     from f in filteredFiles 
      join j in entities.Jobs 
      on f.IDFile equals j.IDFile 
     where j.Version == version 
     select f; 
} 

List<File> lstFile = filteredFiles.Distinct().ToList(); 
+0

您是否尝试添加include _after_这两个'if'块? – 2014-09-29 18:46:06

+0

它不能完成,因为Include函数只能直接从entities.Files集合中获得。在这之后,我正在使用一个没有此功能的IQueryable集合。 – 2014-09-29 18:51:27

+0

'IQueryable '上还有一个扩展方法吗? http://msdn.microsoft.com/en-us/library/dn220202(v=vs.113).aspx – 2014-09-29 18:58:13

回答

0

Eren Ersönmez点我出去,有恩Include功能的IQueryable接口,我决定尝试升级我的EF4到EF6与此更新,功能可用!这在Microsoft的文档中并不清楚。

如果这可以帮助别人,我已经按照this tutorial关于如何从EF4更新到EF6。

感谢Eren的帮助!

0

Include仅仅意味着在执行查询时Jobs属性不会推迟执行,每个记录是要还回所有的相关Jobs记录。在你的连接中,你实际上是过滤掉没有满足给定条件的作业的文件。您不会过滤掉这些文件的作业,而是将所有包含这些作业的文件过滤掉。 Include不会阻止这些文件被过滤掉。

+0

我应该如何在主动/版本上做我的过滤器?由于我是linq新手,也许我的两个查询不好。我的目标是选择包含具有这些参数的作业的文件。 – 2014-09-29 18:49:06

+0

@ Jean-FrançoisCôté你就是这么做的。 – Servy 2014-09-29 18:50:07

+0

好的,结果看起来不错,只是他们没有加载相关的作业。为什么?例如,它返回3个文件(每个文件有3个作业),但它们没有加载。 – 2014-09-29 18:55:59