2013-05-16 48 views
0

我想執行的EF5下面的查詢:實體框架檢查集合包含項目

var data = from adi in _repo.AccountingDocumentItems 
        from e in adi.Employees 
        let c = adi.Employees.Count() 
        where 
         (adi.AccountingDocument.DocumentDate >= start && adi.AccountingDocument.DocumentDate <= queryEnd) && 
         (c > 0) && 
         (_repo.AccountingEntries.Count(p => p.AccountingDocumentId == adi.AccountingDocumentId) != 0)) 

被打破是在where子句中的最後一行,我嘗試檢查一個AccountingEntries的部分存在與AccountingDocumentItem的AccountingDocumentId鏈接的項目。我收到一個錯誤:

「無法創建類型爲'AppName.Domain.Entities.AccountingEntry'的常量值。在此上下文中僅支持基本類型或枚舉類型。」

我不明白爲什麼會發生這種情況,因爲我特別選擇了這些項目的計數。我也嘗試了以下結果:

_repo.AccountingEntries.Any(x => x.AccountingDocumentId == adi.AccountingDocumentId) 

任何輸入將不勝感激。

Gary。

回答

0

,你可以嘗試

var accountingEntriesId = _repo.AccountingEntries.Select(m => m.AccountingDocumentId); 

var data = from adi in _repo.AccountingDocumentItems 
        where 
         adi.AccountingDocument.DocumentDate >= start && 
         adi.AccountingDocument.DocumentDate <= queryEnd && 
         adi.Employees.Any() && 
         accountingEntriesId.Contains(adi.AccountingDocumentId) 

編輯

你也可以使用一個inner join:如果元素不存在AccountingEntries,什麼都不會被檢索,這是(如果我沒錯)你想要什麼。

var data = from adi in _repo.AccounginDocumentItems 
      join ae in _rep.AccountingEntries on adi.AccountingDocumentId equals ae.AccountingDocumentId 
      where 
       adi.AccountingDocument.DocumentDate >= start && 
       adi.AccountingDocument.DocumentDate <= queryEnd && 
       adi.Employees.Any() 
+0

嗨拉斐爾,謝謝,上述肯定的作品,但表現明智,它不適合作爲我的AccountingEntries表可能會遇到成千上萬。我沒有用Profiler檢查過,但我認爲它會從AccountingEntries表中返回所有AccountingDocumentId字段。 – Gary

+0

@加里當然會......我在編輯中給了一個替代方案。 –

+0

嗨拉斐爾,再次感謝,加入肯定會工作。我試圖根據一個名爲'ReceiptMustExist'的布爾字段來動態地過濾查詢,這就是爲什麼我沒有首先進入連接路由的原因,但是我總是可以根據需要在沒有連接的情況下運行不同的查詢。謝謝。 – Gary