我有“建筑物”实体,而在该实体内部我还有另一个“公寓”实体。我要过滤那些至少有一个公寓处于“已批准”状态且可访问性为“可出售”的建筑物。
这是我的Building类。
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类型的操作数
任何帮助将不胜感激。
答案 0 :(得分:0)
您正在寻找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));
答案 1 :(得分:0)
您的方案需要在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)
});
答案 2 :(得分:0)
从@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());