2013-12-17 2 views
0
Table : tblEmp 
EmpId EmpName ManagerId 
101 john  Null 
102 jack  101 

0 след. запрос дает ошибку, что материализованное значение равно null. Где я иду не так. Обратите внимание, что EmpId & ManagerId на самом деле являются идентификаторами GUID в таблице.Вступить в систему Вступить в Linq дает

Использование C#, LINQ к объектам

public DataTable GetData(guid id) 
{ 
    var qry = from e in MYDB.tblEmps.where(e=>e.EmpId==id) 
      join m in MYDB.tblEmps on e.ManagerId equals m.EmpId into emp_mgr 
      from m in emp_mgr.DefaultIfEmpty() 
      select new 
      { 
       name = m.empname ?? string.empty, 
       id = e.managerid //also tried e.managerid ?? guid.empty 
      } 
    DataTable dt = qry.ToDataTable(); 
    return dt; 
} 
+0

Я действительно не использую синтаксис запроса, поэтому я не уверен в этом, но если вы используете '==' здесь, а не '='? 'e.ManagerId = m.EmpId в emp_mgr' – evanmcdonnal

+0

oh.Typo. Это было «равно». Обновлено. – Ruby

+0

ОШИБКА. Приведение значения к типу «Guid» не выполнено, поскольку материализованное значение равно null. – Ruby

ответ

0

Вы должны checkk т на нуль, в операторе отбора. Также у Вас есть ошибка в синтаксисе объединения (должно быть равно):

var qry = from e in MYDB.tblEmps.where(e=>e.EmpId==id) 
      join m in MYDB.tblEmps on e.ManagerId equals m.EmpId into emp_mgr 
      from m in emp_mgr.DefaultIfEmpty() 
      select new 
      { 
       name = m != null && m.empname != null ? m.empname : string.empty, 
       id = e.managerid //also tried e.managerid ?? guid.empty 
      } 
+0

Это кажется разумным, однако, это LINQ to Entities, а не LINQ to Objects. Строки не являются NULL в SQL (у вас может быть NULL как значение в столбце или 0 строк, но вы не можете иметь нулевую строку). Этот выбор будет переведен в 'SELECT m.empname, e.managerid'. m и e являются псевдонимами таблицы и не могут быть нулевыми, в SQL нет ссылок, они здесь просто не применяются. – evanmcdonnal

+0

Большое спасибо evan. – Ruby

0

После небольшого исследования моего подозрения, что qry равна нуль при вызове ToDataTable() на нем. Поэтому я бы просто изменил последние строки линии;

if (qry == null) 
    return null; 
    else 
    return qry.ToDataTable(); 

Вы можете подтвердить, что это действительно источник проблемы, установив точку останова на текущей qry.ToDataTable() линии и подтверждения того, или нет qry равна нулю в этой точке, но я довольно уверен, что это вопрос потому что нулевые ссылки на самом деле не являются предметом вашего запроса LE.

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