[英]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.