gpt4 book ai didi

c# - Entity Framework - 使用 TPT 设置加载子类实体

转载 作者:太空宇宙 更新时间:2023-11-03 12:33:36 25 4
gpt4 key购买 nike

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

//  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

关于c# - Entity Framework - 使用 TPT 设置加载子类实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41838039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com