繁体   English   中英

实体框架 - 使用 TPT 设置加载子类实体

[英]Entity Framework - Loading Subclass Entities with TPT Setup

我们的系统正在接收来自两个外部来源的输入(电话/网络提交)。

//  Table-Per-Type Hierarchy
public class Submission
{
    public int SubmissionId { get; set; }   // Primary Key
    public int? PersonId { get; set; }
    public int? CompanyId { get; set; }
    public long? EmployeeId { get; set; }
    public bool? Completed { get; set; }
    public string AbsenceReason { get; set; }
    public string AbsenceType { get; set; }
    public DateTime? AbsenceDate { get; set; }
}

public class CallSubmission : Submission
{
    public string CallerId { get; set; }
    public string PhoneNumber { get; set; }
    public DateTime? HangUp { get; set; }
    public DateTime? PickUp { get; set; }        
}

public class WebSubmission : Submission
{
    public string EmailAddress { get; set; }
    public string PhoneNumber { get; set; }
    public DateTime SubmissionDate { get; set; }
}

我的目标是根据我们正在处理的提交类型使用PickUp/SubmissionDate检索过去 7 天内的所有提交。 是否可以使用单个 LINQ 语句来实现这一点? 理想情况下,我想避免在内存中加载两个不同的数据集。

我希望整合的语句

Users.Where(user => user.UserName == name)
     .SelectMany(user => user.Submissions)
     .OfType<CallSubmission)()
     .Where(call => call.PickUp >= startDate)

Users.Where(user => user.UserName == name)
     .SelectMany(user => user.Submissions)
     .OfType<WebSubmission>()
     .Where(web => web.SubmissionDate >= startDate)

实际上(对我来说令人惊讶)你问的是可能的(至少在最新的 EF6.1.3 中),因为支持 C# isas运算符(它们基本上由OfType方法使用)。

var query = db.Users
    .Where(user => user.UserName == name)
    .SelectMany(user => user.Submissions)
    .Where(subm => (subm as CallSubmission).PickUp >= startDate
        || (subm as WebSubmission).SubmissionDate >= startDate);

重要的部分是使用as运算符而不是cast ,这会产生不受支持的异常。 不需要检查null因为生成的 SQL 查询自然处理NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM