2017-03-15 170 views
0

我想過濾我的實體框架v6查詢,但沒有太大的成功。 這裏是我的表(和實體模型)。 - 文件上傳 - IEnumerable的化合物 - 字符串名稱實體框架6-渴望加載和過濾嵌套集合

  • 複合

    • IEnumerable的結果
    • INT CompoundType
  • 結果

    • INT與resultType

我想,我對每個where子句返回所有3個集(文件,化合物結果)運行查詢。 我也希望加載結果幷包含NoTracking(因爲這是一個Web服務)。

這可以通過SQL中的內部連接輕鬆實現,但由於某些原因,我無法在EF中實現同樣的功能。

因此,例如,我需要得到的 列表 - 文件上傳,其中FileUpload.Name =「XYZ」 - 當化合物也等於3 - 其中結果等於10點

任何建議表示讚賞,因爲我在過去的幾天裏,我一直在試圖解決這個問題。

回答

0

免責聲明:我是這個項目的所有者Entity Framework Plus

EF +查詢IncludeFilter功能允許過濾相關實體。

var files = context.Files 
    .Where(x => !x.IsDeleted) 
    .IncludeFilter(x => x.Compound.Where(y => !y.IsDeleted))) 
    .IncludeFilter(x => x.Compound.Select(y => y.Result.Where(z => !z.IsDeleted))) 
    .ToList(); 

注:每個路徑必須包含

百科:EF+ Query IncludeFilter

ANSWER子問題:

我想這是不可能的EF6?

此功能在EF5 & EF6中受支持。

由於SELECT N+1問題,我們還不能支持EF Core。

0

如果您沒有使用AsNoTracking還可以,還有另一種方法。

相反,您可以首先使用所需的確切數據加載子表。然後在最後,你只需加載你的頂級表。DbContext將自動映射這些關係,並且只包含那個時候加載到內存中的子數據。

僞代碼:

var ctx = new MyContext(); 
ctx.Compounds.Where(a => ...).ToList(); // Now in ctx memory 
ctx.Results.Where(a => ...).ToList() // Now in ctx memory 
return ctx.FileUploads.Where(a => ...).ToList(); // Will auto hook up any relationships loaded in memory