2015-02-10 5 views
0

у меня есть два результата Linq (результат result2)Регистрация на двух результатов Linq

 List<Employee> result= new List<Employee> { 
      new Employee { EmpId= 4, Date ='2014-02-26', EmpName= "abc"}, 
      new Employee { EmpId = 5, Date = '2014-02-26', EmpName= "abc"}, 
      new Employee { EmpId = 6, Date ='2014-02-26', EmpName= "abc"}, 
      new Employee { EmpId= 7, Date = '2014-02-26', EmpName= "abc"} }; 

     // Create a list of students. 
     List<Student> result2 = new List<Student> { 
      new Student { EmpId= 1, Date ='2014-02-26', StudentId = 9562 }, 
      new Student { EmpId= 2,Date ='2014-02-26', StudentId = 9870 }, 
      new Student { EmpId= 4,Date ='2014-02-26', StudentId = 9913 } }; 

Я хочу, чтобы следующий результат, я попытался с различными запросами, но не получить так:

new Employee { EmpId= 4, Date ='2014-02-26', EmpName= "abc",StudentId=9913}, 
      new Employee { EmpId = 5, Date = '2014-02-26', EmpName= "abc",StudentId=Null}, 
      new Employee { EmpId = 6, Date ='2014-02-26', EmpName= "abc",StudentId=Null}, 
      new Employee { EmpId= 7, Date = '2014-02-26', EmpName= "abc",StudentId=Null} }; 

Я выполнил нижеследующий запрос, но получаю исключение "

(Исключение NullReferenceException) Ссылка на объект не установлена ​​в экземпляр объекта."

var res = (from r in result 
          join r2 in result2 on new { EmpId= r.EmpId, Date = r.Date.Value.Year } equals new { EmpId= Convert.ToInt32(r2.EmpId), Date = r2.Date.Value.Year } into list 
          from l in list.DefaultIfEmpty() 
          select new 
          { 
           EmpId= r.EmpId, 
    Date=r.Date, 
    EmpName=r.EmpName, 
    StudentId=l.StudentId 
    }).ToList(); 

Пожалуйста, дайте мне знать, если кто-нибудь знает.

+0

Результатом 'DefaultIfEmpty' является' null' для ссылочных типов при пустом. –

ответ

1

Проблема здесь:

StudentId = l.StudentId 

Некоторые из ваших l ценностей null так NullReferenceException брошено. Вы должны проверить null значений:

var res = (from r in result 
      join r2 in result2 
       on new { EmpId= r.EmpId, Date = r.Date.Value.Year } 
       equals new { EmpId= Convert.ToInt32(r2.EmpId), Date = r2.Date.Value.Year } 
       into list   
      from l in list.DefaultIfEmpty() 
      select new 
      { 
       EmpId = r.EmpId, 
       Date = r.Date, 
       EmpName = r.EmpName, 
       StudentId = (l != null) ? l.StudentId : (int?)null 
      }).ToList(); 

(с учетом LINQ к объектам, не уверен, что, если такое выражение справедливо в LINQ-to-Entities)