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

該foll。查詢會提供物化值爲空的錯誤。我哪裏錯了。請注意,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 into emp_mgr' – evanmcdonnal

+0

oh.Typo。這是'等於'。更新。 – Ruby

+0

錯誤 - 因爲物化值爲空,所以強制類型值爲'Guid'失敗。 – Ruby

回答

0

你應該checkk對空米,SELECT語句。你也有加入語法錯誤(應該是等於):

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。 SQL中的行不是NULL(可以將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查詢中不是真的。