实体框架检查集合是否包含项目

时间:2013-05-16 11:56:33

标签: linq entity-framework entity-framework-5

我正在尝试在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子句的最后一行,我尝试检查是否存在与AccountingDocumentItem的AccountingDocumentId链接的AccountingEntries项。我收到一个错误:

“无法创建类型'AppName.Domain.Entities.AccountingEntry'的常量值。在此上下文中仅支持基本类型或枚举类型。”

我不明白为什么会这样,因为我特意选择了那些项目的计数。我也尝试了以下相同的结果:

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

非常感谢任何输入。

加里。

1 个答案:

答案 0 :(得分: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()