c# - LINQ 包含和继承
问题描述
我有一个 WEB API 项目,它使用 Database First 模型。我有基类Building
实体和MultiApartmentBuilding
从 Building 继承的实体。我也有一个Apartment
实体,它与Building
实体以一对多的关系连接。我想通过给定的公寓 ID 获得特定的公寓,并包含一些MultiApartmentBuilding
信息。
到目前为止,我已经尝试通过Include()
LINQ 方法达到理想的结果,但是遇到了一个我无法包含的问题MultiapartmentBuilding
。
这是我的Building
课。
public abstract class Building
{
public int Id { get; set; }
public BuildingState State { get; set; }
public BuildingType Type { get; set; }
public int AddressId { get; set; }
public Address Address { get; set; }
public MultilingualString Description { get; set; }
public string MainImg { get; set; }
public bool IsBuilt { get; set; }
}
这是我的MultiApartmentBuilding
课。
public class MultiApartmentBuilding : Building
{
public int GroundFloorCount { get; set; }
public double FloorHeight { get; set; }
public int? WallId { get; set; }
public Wall Wall { get; set; }
}
这是我的Apartment
课。
public class Apartment : EntityBase
{
public int Id { get; set; }
public int BuildingId { get; set; }
public Building Building { get; set; }
public Common.Enums.ApartmentState State { get; set; }
public AccessibilityState Accessibility { get; set; }
public int Floor { get; set; }
public bool IsPentHouse { get; set; }
}
这是我的 LINQ 查询,应该返回公寓。
var apartment = _context.Apartments
.Where(id => id.Id == apartmentId)
.Include(building => building.Building)
.ThenInclude(address => address.Address)
.ThenInclude(city => city.City)
.ThenInclude(cityName => cityName.Name)
.Include(district => district.Building.Address.District)
.ThenInclude(districtName => districtName.Name)
.Include(street => street.Building.Address.Street)
.Include(condPrices => condPrices.ConditionPrices)
.ThenInclude(condition => condition.Condition)
.ThenInclude(conditionName => conditionName.Name)
.ThenInclude(conditionNameTranslation => conditionNameTranslation.Translations)
.Include(builder => builder.Building.Builder)
.ThenInclude(brandName => brandName.BrandName)
.ThenInclude(brandNameTrans => brandNameTrans.Translations)
.Include(builderBussinesAddress => builderBussinesAddress.Building.Builder.BusinessAddress)
.ThenInclude(tranlsations => tranlsations.Translations)
.Include(descriptipon => descriptipon.Description)
.ThenInclude(descriptionName => descriptionName.Translations)
此查询的问题是我无法访问MultiApartmentBuilding
字段。我只能访问Building
字段,尽管MultiApartmentBuilding
是从Building
. 有没有办法也可以访问MultiApartmenBuilding
字段?
解决方案
包括Building
也将包括MultiApartmentBuilding
条目(实际上所有类型派生自Building
)。
您可以使用 C# 7.0 的模式匹配同时进行测试和强制转换(apartments
查询结果在哪里):
foreach (Apartment apartment in apartments) {
// Access common Building field.
Console.WriteLine(apartment.Building.Id);
// Access specialized field from derived building type.
if (apartment.Building is MultiApartmentBuilding maBuilding) {
Console.WriteLine(maBuilding.GroundFloorCount);
}
}
如果你有很多类型的建筑物,你可以在 switch 语句中使用模式匹配
switch (apartment.Building)
{
case MultiApartmentBuilding maBuilding:
Console.WriteLine(maBuilding.GroundFloorCount);
break;
case Igloo igloo:
Console.WriteLine(igloo.SnowQuality);
break;
default:
Console.WriteLine("all other building types");
break;
}
推荐阅读
- python - 我需要帮助来修复我的代码,以免从房间里拿东西两次
- html - 在 html 中分层图像和 div 大小
- python - 如何按月+年的顺序对数据框进行排序?
- java - 带有 maven 的 gitlab CI/CD 不会在 application.properties 中设置环境变量
- applescript - 仅从 AppleScript 中的字符串中提取字母字符
- android - 暂时隐藏Android中其他应用的通知
- azure - Azure - 在未启用事件中心捕获选项的情况下访问保留的事件中心数据
- rust - 循环中的多个可变引用
- google-sheets - 将工作表中的某些信息拉到主工作表中
- android - Kotlin 卡在 1.3.31 版本的 Android Studio 项目上