繁体   English   中英

Linq嵌套Where()子句

[英]Linq nested Where() clause

我有建筑物实体,并且在该实体内部有另一个实体Apartment。我想过滤至少有一个公寓带有“批准”状态且可访问性为“可出售”的建筑物。

这是我的建筑课。

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

这是我的公寓房。

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类型的操作数

任何帮助,将不胜感激。

您正在寻找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语句中的最终值必须是布尔值时,它将返回IEnumerable(IQueriable)。 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)); 

您的方案需要在linq查询中加入。 您可以这样写:

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)
                           });

从@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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM