![](/img/trans.png)
[英]Prevent the loading of subclass table rows in TPT inheritance on Entity Framework
[英]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# is
和as
運算符(它們基本上由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.