2017-01-24 6 views
2

Наша система получает входные данные от двух внешних источников (телефонный звонок/веб-представление).Entity Framework - загрузка объектов подкласса с установкой TPT

// 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 в зависимости от типа представления мы имеем дело с. Можно ли добиться этого с помощью одного оператора 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) 
+0

В чем проблема с запросом 'UNION'? –

+0

Я не должен был использовать СОЮЗ; Я имел в виду загрузку двух наборов данных и памяти, а затем их объединение. Я был бы открыт для использования оператора SQL UNION, если это возможно в этом случае с LINQ. –

ответ

1

Собственно (удивительно для меня), что вы спрашиваете, можно (по крайней мере, в последнем 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 s естественно.

+0

Perfect - Спасибо за помощь! Похоже, что все свойства включены для разных подтипов, поэтому он будет работать отлично. –

Смежные вопросы