2015-08-12 3 views
-2

Так что я делаю запрос, чтобы получить Отсутствие от сотрудника (через его идентификатор) определенного года (2015 в данном случае).Этот запрос LINQ неверен?

enter image description here

Это БД модель, и эти классы:

[Serializable] 
public class Absence 
{ 
    public Int32 IDAbsence; 
    public Int32 IDEmployee; 
    public Int32 Period; 
    public DateTime BeginDate; 
    public DateTime? EndDate; 
    public AbsenceType AbsenceType; 
    public AbsenceStatus AbsenceStatus; 
    public List<Justification> Justifications; 
    public List<Notification> Notifications; 

    public Absence() { } 

    public Absence(Int32 IDAbsence, Int32 IDEmployee, Int32 Period, DateTime BeginDate, DateTime? EndDate, AbsenceType AbsenceType, AbsenceStatus AbsenceStatus, List<Justification> Justifications, List<Notification> Notifications) 
    { 
     this.IDAbsence = IDAbsence; 
     this.IDEmployee = IDEmployee; 
     this.Period = Period; 
     this.BeginDate = BeginDate; 
     this.EndDate = EndDate; 
     this.AbsenceType = AbsenceType; 
     this.AbsenceStatus = AbsenceStatus; 
     this.Justifications = Justifications; 
     this.Notifications = Notifications; 
    } 
    } 

[Serializable] 
    public class TimePeriod 
    { 
     public Int32 IDTimePeriod; 
     public DateTime StartTime; 
     public DateTime EndTime; 

     public TimePeriod() { } 

     public TimePeriod(Int32 IDTimePeriod, DateTime StartTime, DateTime EndTime) 
     { 
      this.IDTimePeriod = IDTimePeriod; 
      this.StartTime = StartTime; 
      this.EndTime = EndTime; 
     } 
    } 

TimePeriod первичный ключ (IDTimePeriod) должна быть ссылка для внешнего ключа периода в отсутствие таблице, но Я не могу создать внешний ключ для Period (да, DB, с которым я работаю, довольно запутанным ...).

Это мой запрос LINQ:

public static List<Tuple<Absence,TimePeriod>> GetAbsencesByEmployeeIDAndYear(Int32 employeeID, Int32 year) { 

       List<Tuple<Absence,TimePeriod>> absences = dataContext.Absences.Join(dataContext.TimePeriods, 
                  abs => abs.Period, 
                  tps => tps.IDTimePeriod, 
                  (abs, tps) => new Tuple<Absence, TimePeriod>(abs, tps)) 
               .Where(abstps => abstps.Item1.Employee.IDEmployee == employeeID && abstps.Item2.StartTime.Year == year).ToList(); 

      return absences; 
     } 

И это ошибка:

Object reference not set to an instance of an object.

Как ни странно, потому что я посмотрел в БД, и есть записи отсутствий для данного сотрудника в 2015 году с соответствующим периодом времени. Нет случаев, когда Period не нашел соответствующий IDTimePeriod.

Что мне не хватает?

+3

, если этот запрос является правильным, вы получите ожидаемый результат –

+0

Вы уверены, вы инициализировать DataContext? –

+0

Должен ли 'Employee.IDEmployee' быть' IDEmployee'? – DavidG

ответ

0

Дайте этому попытку:

public static List<Tuple<Absence,TimePeriod>> GetAbsencesByEmployeeIDAndYear(Int32 employeeID, Int32 year) { 

    List<Tuple<Absence,TimePeriod>> absences = dataContext.Absences.Join(dataContext.TimePeriods, 
    abs => abs.Period, 
    tps => tps.IDTimePeriod, 
    (abs, tps) => new { abs, tps}) 
    .Where(x => x.abs.Employee.IDEmployee == employeeID && x.tps.StartTime.Year == year) 
    .Select(t => new Tuple<Absence,TimePeriod>(t.abs, t.tps)) 
    .ToList(); 

    return absences; 
} 
+0

Только без параметров конструкторы и инициализаторы поддерживаются в LINQ to Entities. – Cajux94

+0

Мне удалось это исправить ... Мне пришлось переключаться между списком и выбором и ожидать IEnumerable – Cajux94