使用LINQ和TPT EF时如何转换为子类?

时间:2012-10-08 23:25:05

标签: entity-framework casting ef-code-first

我有以下类层次结构:

public class RealPeople { }

public class Users : RealPeople { }
public class People : RealPeople { }

在我的dbContext中,我为RealPeople定义了一个dbSet,在OnModelCreating过程中,我为People和Users指定了单独的表:

modelBuilder.Entity<Users>().ToTable("Users");
modelBuilder.Entity<People>().ToTable("People");

这将在我的数据库中创建相应的完整层次结构,其中包含3个相应的表。 当我想在我的数据库中检索Users列表时出现问题。 这样:

List = (from Reg in PersistentMgr.RealPeople select (Users)Reg)
       .ToList();

或者这个:

List = (from Reg in PersistentMgr.RealPeople select (Users)((RealPeople)Reg))
       .ToList();

引发异常:

  

LINQ只能投射原始模型类型。

所以问题是,我无法将RealPeople转换为相应的子类Users。 关于这个的任何想法?

2 个答案:

答案 0 :(得分:10)

获取子类集合的方法是使用OfType

var users = (from p in PersistentMgr.RealPeople select p).OfType<User>();

答案 1 :(得分:5)

请改为尝试:

var list = PersistentMgr.RealPeople.Select(reg => reg as Users).ToList();

更好:

var list = PersistentMgr.RealPeople.Select(reg => (reg is Users) ? reg as Users : null).ToList();

如果你尝试这个,你会得到同样的错误:

var realperson = new RealPeople();
var user = (Users) realperson;

原因是因为编译器不知道如何通过简单的转换将复杂类型转换为它们的子类型 - 所以你需要使用as关键字。这将返回null,或者将子类型转换为子类型。

var realperson = new RealPeople();
var user = realperson as Users; // user is realperson converted into a Users object
var aString = "this is a string";
var otheruser = aString as Users; // otheruser is null, because aString was not a valid supertype for Users