8

次のクラス階層があります。

public class RealPeople { }

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

私のdbContextではRealPeople、OnModelCreatingプロシージャのdbSetを定義し、PeopleとUsersに別々のテーブルを指定しました。

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

これにより、3つの対応するテーブルとともに、対応する完全な階層がDBに作成されます。UsersDB内のリストを取得したいときに問題が発生します。これ:

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

またはこれ:

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

例外をスローします:

LINQは、プリミティブモデルタイプのみをキャストできます。

つまり、RealPeopleを対応するサブクラスUsersにキャストすることはできません。これについて何かアイデアはありますか?

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 に答える