3

我们有一个名为Unit的实体集合、一个名为UnitProp的实体集合和一个名为Prop的实体集合,其定义如下(简化):

class Unit
{
    int ID;
    ICollection<UnitProp> UnitProps;
}

class UnitProp
{
    int ID;
    int UnitID;
    Unit Unit;
    int PropID;
    Prop Prop;
}

class Prop
{
    int ID;
    string Description; 
}

我们有一个Listof Props(称为RequiredProps)我们需要用来查询集合。我们希望返回满足在RequiredProps中指定Unit所有 s 的条件的 s集合。Prop

我这样写查询:

var result = ctx.Units
    .Where(x => RequiredProps.AsEnumerable()
        .Except(x.UnitProps.Select(y => y.Prop))
        .Count() == 0)
    .ToList();

当然,这是 Linq to Entities,所以查询会抛出异常: 无法创建“Prop”类型的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。

我也试过这个:

var result = ctx.Units
    .Where(x => RequiredProps.Select(y => y.ID)
        .Except(x.UnitProps
            .Select(y => y.Prop)
            .Select(y => y.ID))
        .Count() == 0)
    .ToList();

...但它产生了同样的例外。

建议?

4

1 回答 1

2
var requiredIds = RequiredProps.Select(y => y.ID);

var result = ctx.Units
                .Where(m => !requiredIds
                    .Except(m.UnitProps.Select(x => x.Prop.ID)))
                    .Any())
                 .ToList();
于 2012-06-14T12:26:13.710 回答