8

我有以下类层次结构:

public class RealPeople { }

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

在我的 dbContext 中,我为RealPeopleOnModelCreating 过程定义了一个 dbSet,我为 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 转换为相应的子类用户。关于这个有什么想法吗?

4

2 回答 2

12

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

var users = (from p in PersistentMgr.RealPeople select p).OfType<User>();
于 2012-10-09T11:46:37.620 回答
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
于 2012-10-08T23:48:09.837 回答