C# 按类型继承计算表中的查询生成数

C# 按类型继承计算表中的查询生成数,c#,asp.net-mvc,entity-framework,table-per-type,C#,Asp.net Mvc,Entity Framework,Table Per Type,我有一个典型的TPT场景(不要问我为什么做TPT,这可能是一个愚蠢的选择),我正在尝试对基类型运行一个简单的计数查询。 考虑到计数是基于基类和基类上的属性的,我不明白为什么EF通过将所有派生类型连接在一起来创建一个count(*)查询 课程是这样的: public abstract class StudyCase { public DateTime? DateSubmitted { get; protected set; } public bool Deleted { get;

我有一个典型的TPT场景(不要问我为什么做TPT,这可能是一个愚蠢的选择),我正在尝试对基类型运行一个简单的计数查询。 考虑到计数是基于基类和基类上的属性的,我不明白为什么EF通过将所有派生类型连接在一起来创建一个
count(*)
查询

课程是这样的:

public abstract class StudyCase {
    public DateTime? DateSubmitted { get; protected set; }
    public bool Deleted { get; set; }
}

public class StudyCaseStandard : StudyCase { 
// ... other stuff
}

public class StudyCaseReview : StudyCase { 
// ... other stuff
}
SELECT COUNT(1) AS [A1]
FROM [dbo].[StudyCases]
WHERE ([Deleted] <> 1) AND ([DateSubmitted] IS NOT NULL)
我的问题是这样的

SubmittedCasesCount = _context.Set<StudyCase>().Where(sc => !sc.Deleted).Count(sc => sc.DateSubmitted.HasValue);

当不需要派生类的属性或返回集只是基类的一组时,如何强制EF生成更简单的查询(这也可能取决于基类上的
abstract
关键字,但EF应该能够实现抽象类的代理)?

如果使用select语句仅从基类中提取属性,将生成什么查询,如下所示:

SubmittedCasesCount = 
    _context
        .Set<StudyCase>()
        .Select(sc => new { Deleted = sc.Deleted, DateSubmitted = sc.DateSubmitted })
        .Where(anon => !anon.Deleted)
        .Count(anon => anon.DateSubmitted.HasValue);
SubmittedCasesCount=
_上下文
.Set()
.Select(sc=>new{Deleted=sc.Deleted,DateSubmitted=sc.DateSubmitted})
.Where(anon=>!anon.Deleted)
.Count(anon=>anon.DateSubmitted.HasValue);
编辑: 遗憾的是,上面生成了相同的查询,我知道的唯一其他解决方案是执行原始SQL查询,类似于:

int count = context.Set<StudyCase>
                   .FromSql("SELECT Deleted, DateSubmitted FROM dbo.StudyCases")
                   .Where(sc => !sc.Deleted).Count(sc => sc.DateSubmitted.HasValue)
                   .Count();
int count=context.Set
.FromSql(“选择已删除,从dbo.StudyCases提交的日期”)
.Where(sc=>!sc.Deleted).Count(sc=>sc.DateSubmitted.HasValue)
.Count();

edit:将此更改为代码格式的答案这很遗憾,我用另一种方法进行了编辑,虽然有点不那么优雅。自定义查询是我不想去的方向,尽管在我看来它也是唯一的选择。。。
int count = context.Set<StudyCase>
                   .FromSql("SELECT Deleted, DateSubmitted FROM dbo.StudyCases")
                   .Where(sc => !sc.Deleted).Count(sc => sc.DateSubmitted.HasValue)
                   .Count();