簡體   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