[英]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
將返回true
或false
供您過濾。
更新:新要求,僅獲得具有過濾功能的公寓。
擁有建築物后,如果只希望獲得批准並可以出售的公寓,則可以再次進行過濾。
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.