在实体框架中使用Table per Hierarchy
设置时,我遇到了设计服务层的问题。我的问题是我得到一个特定类型的对象,但我想检查类型是什么。这在代码中有更好的解释:
抽象域类
public abstract class Order
{
public string OrderId { get; set; }
}
继承的课程
public class OrderProduct : Order
{
public List<OrderDetail> OrderDetails { get; set; }
}
public class OrderSubscription : Order
{
public decimal Fee { get; set; }
public DateTime? EndDate { get; set; }
}
所以你基本上可以这样做:
orderRepository.GetOrders();
//OR
orderRepository.GetOrders().OfType<OrderProduct>();
//OR
orderRepository.GetOrders().OfType<OrderSubscription>();
我基本上使用的是第一个。它返回IQueryable<Order>
我想制作一个服务层方法来进行任何类型的调用,例如:
public Order GetOrder(string orderId)
{
return orderRepository.GetOrders().FirstOrDefault(o => o.OrderId == orderId);
}
问题
在我的控制器中,如何在调用GetOrder(string orderId)
后判断对象的类型?如果它是OrderProduct
类型,那么当我投射它时,我还需要导航属性(List<OrderDetail>
)。
我看到的一个解决方案是为每个Order
类进行两种类型的服务层调用。调用1,如果返回null,则调用另一个。但是在C#中有没有OOP方法呢?
答案 0 :(得分:2)
我不完全确定你在问什么,但我认为你正在寻找is
运营商:
Order order = //...
bool isSubscription = order is OrderSubscription;
此外,如果您想在之后使用该值,您也可以使用as
,这会将其强制转换或返回null
它不属于该类型。
Order order = //...
OrderSubscription subscription = order as OrderSubscription;
if (subscription != null)
{
// use subscription
}
答案 1 :(得分:0)
Order o = GetOrder("12345");
if (o is OrderProduct)
{
var product = (OrderProduct)o;
}
else if (o is OrderSubscription)
{
var subscription = (OrderSubscription)o;
}
这可以满足您的需求吗?我对你的需求有点模糊。