簡體   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