如何解决实体框架继承-仅检索父类型
| I供应商类别:public class Supplier {
....
....
....
}
我也有分包商类,并且分包商是供应商:
public class Subcontractor:Supplier {
....
....
....
}
在我的数据库中,我有带有数据的Suppliers表和另一个具有id字段的表,该表充当供应商表的外键,并且那里也有分包商数据。
在实体框架edmx文件中,我声明了继承关系:
现在我想让所有不是分包商的供应商都在做,所以我在做:
context.Suppliers.OfType<Supplier>();
但这也返回了分包商。
我如何才能只获得不是分包商的供应商?
解决方法
试试看:
context.Suppliers.Where(s => !(s is Subcontractor));
编辑
如果您有多个类来自Supplier
,则LINQ to Entities的唯一选择似乎是:
context.Suppliers.Where(s => !(s is Subcontractor)
&& !(s is DerivedClass2)
&& !(s is DerivedClass3)); // etc.
实体SQL支持ONLY关键字,该关键字允许查询特定类型。但是没有相应的副本作为LINQ运算符。
这是一个OfTypeOnly<TEntity>
运算符的实现,但它大量使用元数据信息和手动表达式构建,并且在简单情况下可能会过分使用。
,我目前使用以下LINQ扩展,假设子类位于同一程序集中。
public static class MyLinqExtensions
{
public static IQueryable<T> OfTypeOnly<T>(this IQueryable<T> query)
{
Type type = typeof (T);
IEnumerable<Type> derivedTypes = Assembly
.GetAssembly(type)
.GetTypes()
.Where(t => t.IsSubclassOf(type));
return query.ExceptTypes(derivedTypes.ToArray());
}
public static IQueryable<T> ExceptTypes<T>(this IQueryable<T> query,params Type[] excludedTypes)
{
if (excludedTypes == null)
return query;
return excludedTypes.Aggregate(query,(current,excludedType) => current.Where(entity => entity.GetType() != excludedType));
}
}
用法:
// Get only entities of type Supplier,excluding subclasses.
var suppliers = context.Suppliers.OfTypeOnly<Supplier>();
,context.Suppliers.Where(s => s.GetType() == typeof(Supplier));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。