实体框架代码优先:从具有鉴别器的表中选择数据

Tom*_*Tom 5 .net entity-framework ef-code-first

首先对不起,如果我的标题不清楚,但我确实很难用英文简单的句子:).

假设我有一个管理网站,人和超级英雄,我有2个班:

 public class Person
    {      
        [Key]
        public int PersonId { get; set; }

        [MaxLength(100)]
        public string Name { get; set; }    
    }

  public class SuperHero:Person
    {    
        [MaxLength(100)]
        public string SuperHeroName { get; set; }
        public virtual ICollection<SuperPower> SuperPowers{ get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

在我的数据库中,我有这个:

人1:Id = 1姓名="Alex Flimster"Discrimiator ="人"

人2:ID = 2姓名="布鲁斯韦恩"鉴别器="SuperHero"SuperHeroName ="蝙蝠侠"

我知道如果我这样做:

var test = from Context.Person select p;
Run Code Online (Sandbox Code Playgroud)

我得到每个人,英雄与否.

如果我只想要英雄,我会这样做:

var test = from Context.Person.OfType<SuperHero>() select p;
Run Code Online (Sandbox Code Playgroud)

我的问题是:我如何只得到这个人?

var test = from Context.Person.OfType<Person>() select p; 
Run Code Online (Sandbox Code Playgroud)

将返回与第一次测试相同的返回.

编辑 我想我的问题并不完全清楚.假设我有200个人,并且在那个10个超级英雄之上.我需要一个返回所有Person的查询,这些Person只是person而不是可能的heritant类.(假设我还有另一个继承人的"VideoGame Hero".我需要一个简单的查询,这个查询只是个人而不是其他类)

谢谢!

Ser*_*kiy 9

试试这个

from p in Context.Person
where !(p is SuperHero)
select p
Run Code Online (Sandbox Code Playgroud)

或者流利的

Context.Person.Where(p => !(p is SuperHero))
Run Code Online (Sandbox Code Playgroud)

更新:SQL将如下所示:

SELECT 
[Extent1].[Discriminator] AS [Discriminator], 
[Extent1].[PersonId] AS [PersonId], 
[Extent1].[Name] AS [Name], 
[Extent1].[SuperHeroName] AS [SuperHeroName]
FROM [dbo].[Person] AS [Extent1]
WHERE ([Extent1].[Discriminator] IN (N'SuperHero',N'Person')) 
      AND ([Extent1].[Discriminator] <> N'SuperHero')
Run Code Online (Sandbox Code Playgroud)