1

我想使用实体框架执行 NOT EXISTS 查询,并在 LinqPad 中使用以下查询。

var context = new CSSDbEntities();

(from s in context.Appliances
where !context.AvailableResources.Any(es => es.ApplianceId == s.ApplianceId)
select s).Dump();

但是,当我尝试将其传输到我的应用程序时(我将上下文包装在 IUnitOfWork 接口中以允许我使用 Unity 模拟它/注入它/这就是我继承代码库的方式,它失败并显示“无法创建一个常量”运行时的异常。

我试图执行的实际代码是......

var query = from x in unitOfWork.Appliances
            where !unitOfWork.AvailableResources.Any(es => es.ApplianceId == x.ApplianceId)
            select s;

unitOfWork 中的属性实现如下...

public IDbSet<Appliance> Appliances
{
    get { return _objectContext.Appliances; }
}

public IDbSet<AvailableResource> AvailableResources
{
    get { _objectContext.AvailableResources; }
}
4

1 回答 1

0

答案很简单,我被这个相关问题指出了正确的方向。

EF 代码优先:无法创建类型为“”的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)

我应该在 Appliance 对象上使用关联,而不是unitOfWork在我的“子查询”中使用该对象。

我的工作查询变成...

var query = from x in unitOfWork.Appliances
            where !x.AvailableResources.Any(es => es.ApplianceId == x.ApplianceId)
            select s;

注意 where 子句!x .AvailableResources.Any 代替 ! unitOfWork.AvailableResources.Any _

于 2013-03-12T12:02:27.267 回答