是否可以找到共享子表类型的项目列表
使用Linq To实体?
我认为除了使用if/switch来检查类型并使用
is T
或
OfType<T>
。您可以将此逻辑封装到扩展方法中,例如,以便有一个单独的位置进行维护和一个可重用的方法:
public static class Extensions
{
public static IQueryable<InventoryItem> WhereIsLastState(
this IQueryable<InventoryItem> query, Type state)
{
if (state == typeof(InactiveState))
return query.Where(i => i.LastState is InactiveState);
if (state == typeof(ActiveState))
return query.Where(i => i.LastState is ActiveState);
if (state == typeof(CompletedState))
return query.Where(i => i.LastState is CompletedState);
throw new InvalidOperationException("Unsupported type...");
}
}
要这样使用:
public ICollection<InventoryItem> GetInventoryItemsByState(Type state)
{
return inventoryRepository.Get().WhereIsLastState(state).ToList();
}
我不知道是否有可能建造
i => i.LastState is XXX
使用.NET手动创建表达式
Expression
API和基于
Type
传递到方法中。(老实说,我也会感兴趣,但我自己几乎不知道如何操纵表情来回答这个问题。)
考虑到我没有使用Lazy Loading,是否可以包括
使用TPH的子表类型的相关项,例如,如果
我有一个InactiveState作为我可以预加载的InventoryItem的子项
该非活动状态的StateStore?
我不确定我是否理解正确,但通常都很渴望
Include
不支持对包含的特定子项进行任何筛选或附加操作。
绕过这一限制并在单个数据库往返中仍然获得结果的一种方法是使用如下投影:
var result = context.InventoryItems
.Select(i => new
{
InventoryItem = i,
LastState = i.LastState,
StateStore = (i.LastState is InactiveState)
? (i.LastState as InactiveState).StateStore
: null
})
.AsEnumerable()
.Select(x => x.InventoryItem)
.ToList();
如果查询是一个跟踪查询(在上面的例子中就是这样),并且关系不是多对多(在您的例子中不是这样),那么当实体加载到上下文中时,上下文将修复关系,也就是
InventoryItem.LastState
和
InventoryItem.LastState.StateStore
(如果
LastState
属于类型
InactiveState
)将被设置为已加载的实体(
犹如
他们已经装载了大量的货物)。