Linq嵌套Where()子句

3
我可以帮您翻译,将"Original Answer"翻译成"最初的回答"。以下是需要翻译的内容:

我有一个Building实体,在这个实体中,我还有另外一个实体Apartment。我想筛选那些至少拥有一个状态为“已批准”并且可出售的房屋的建筑物。

这是我的Building类。

public class Building 
{
 public ICollection<Apartment> Apartments {get;set;}
}

This is my apartment class.

public class Apartment 
{
  public Enum State {get;set;}   
}

到目前为止,我尝试了这段代码,但似乎它并没有起作用。

最初的回答:

 var buildings = _context.Buildings.Where(apartments.Apartments
              .Any(isActive =>isActive.State == ApartmentState.Approved && isActive.Accessibility == AccessibilityState.Saleable));

这段代码只返回至少有一个公寓符合条件的公寓列表。我不需要其他公寓。
另外,我尝试了另一种方法来实现期望的结果。
var buildings = _context.BuildingsWhere(apartments => apartments.Apartments.Where(apart=> aapart.State == ApartmentState.Approved && apart.Accessibility == AccessibilityState.Saleable));


在这个特定的情况下,我遇到了这个错误:操作符无法应用于类型为bool和IEnumerable的操作数。任何帮助将不胜感激。请注意保留html标签。
3个回答

4

你需要使用Any子句:

var buildings = _context
    .Buildings // For all my buildings
    .Where(b => b.Apartments // I want the ones where
        .Any(a => a.State == ApartmentState.Approved // There is at least 1 approved
            && a.Accessibility == AccessibilityState.Saleable)); // AND one is Saleable.

执行Where语句时,语句的最终值必须为bool,并将返回IEnumerable (IQueryable)。使用Any可返回truefalse,以便您进行筛选。 更新 新要求:仅获取具有过滤条件的公寓。在获取建筑物之后,如果想要仅获得已批准和可销售的公寓,则需要再次进行筛选。
foreach(var building in buildings) {
    var saleableApartments = building.Apartments
        .Where(a => a.State == ApartmentState.Approved
                    && a.Accessibility == AccessibilityState.Saleable));
    // Do whatever.
}

如果你只是在寻找公寓,

var saleableApartments = _context
    .Buildings // For all my buildings
    .Select(b => b.Apartments // Select the apartments
        .Where(a => a.State == ApartmentState.Approved // where x
            && a.Accessibility == AccessibilityState.Saleable)); 

这是否只返回“已批准”和“可封存”的公寓,还包括其他状态的公寓?Any()函数在集合中至少有一个公寓满足谓词时返回true。 - undefined
根据这个,它将返回所有具有已批准并具有可销售通行性的公寓的建筑物。 - undefined
你想要公寓本身吗?“我想筛选出那些至少有一个已获批准且可售的公寓的建筑物。” 这就是说:“嘿,给我一组建筑物中那些有已获批准和可售公寓的建筑物。” - undefined
我想要建筑物,但在建筑物中我有一个IEnumerable的公寓字段。该文件应只包含已批准和可销售状态的公寓。 - undefined
所以你在寻求一些不同的东西。你的最终目标是什么? - undefined

1

根据@BlueEyedBehemoth回答下面的评论,我建议:

var filteredBuildings = _context
    .Buildings
    .Select(b => new { apparments = b.Appartments
        .Where(a => a.State == ApartmentState.Approved
                          && a.Accessibility == AccessibilityState.Saleable) } )
    .Where(b => b.apparments.Any());

0
你的情况需要在你的linq查询中使用join。你可以写成这样:
var apartments = from building in _context.Buildings
                join apartment in _context.Apartments on building.Id equals apartment.BuildingID
                where apartment.State == ApartmentState.Approved 
                && apartment.Accessibility == AccessibilityState.Saleable
                select apartment ;

或者你也可以写一个子查询:
var buildings = _context.Buildings
                  .Select(building => new 
                          { 
                             Building = building ,
                             Apartments = _context.Apartments
                                       .Where(apartment=>
                                        building.Id == apartment.BuildingId &&
                                        apartment.State == ApartmentState.Approved &&
                                        apartment.Accessibility == AccessibilityState.Saleable)
                           });

出现错误:连接子句中的一个表达式类型不正确。 - undefined
你正在获取所有的公寓,如果它们不在这栋建筑物里怎么办? - undefined
@NeoXX,请在你的问题中更新建筑和公寓实体的代码。 - undefined
@BlueEyedBehemoth 这是一个内连接,将会返回与该建筑物相关的公寓。 - undefined
@EhsanSajjad 你在我的评论之后将它添加到了你的子查询中,哈哈。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接