2014-01-08 73 views
1

我有三個表波紋管:多表連接使用LINQ沒有返回值

Table A 
Id 
Divi_code 
Unit_code 
Other column 


Table B 
Divi_code 
Divi_name 

Table c 
Unit_code 
Unit_name 

我必須使用一些地方的條件,列表項可能會或可能不會有divi_code/unit_code數值的從表中生成一個列表。如果列表包含divi_code/unit_code的任何值,我現在需要找到divi_name/unit_name。我這樣做因爲我不想發送divi/unit代碼到用戶界面,我想發送名稱。

我想加入這些表像波紋管:

var list = (from s in DataContext.HRM_HLDY_SPCL_FOR.AsEnumerable() 
        where s.HLDY_DATE == Convert.ToDateTime(Date) 

        join dv in DataContext.HRM_DIVISION on s.DIVI_CODE equals dv.DIVI_CODE 

        join un in DataContext.HRM_UNIT on s.UNIT_CODE equals un.UNIT_CODE 

        select new HRM_HLDY_SPCL_FORModel { HLDY_SPCL_SLNO = (s.HLDY_SPCL_SLNO).ToString(), DIVI_NAME= dv.DIVI_NAME, UNIT_NAME= un.UNIT_NAME, ActiveStatus= s.ACTIVE_STATUS, HLDY_SPCL_REM= s.HLDY_SPCL_REM}).ToList(); 

我的查詢只面向那些既具有divi_code & unit_code數據。即使沒有divi_code/unit_code,我也想要列出所有數據。在這種情況下,divi_name/unit_name爲null就足夠了。

回答

1

我想你是在linq中描述一個left join。有不同的方式來實現這一點。我最喜歡這種方式。很顯然,這是一個左連接:

var list = (from s in DataContext.HRM_HLDY_SPCL_FOR.AsEnumerable() 

       from dv in DataContext.HRM_DIVISION 
        .Where(d=>d.DIVI_CODE==s.DIVI_CODE).DefaultIfEmpty() 

       from un in DataContext.HRM_UNIT 
        .Where(u=>u.UNIT_CODE== s.UNIT_CODE).DefaultIfEmpty() 
       where s.HLDY_DATE == Convert.ToDateTime(Date) 
       select new HRM_HLDY_SPCL_FORModel 
       { 
        HLDY_SPCL_SLNO = (s.HLDY_SPCL_SLNO).ToString(), 
        DIVI_NAME= (dv==null?null:dv.DIVI_NAME), 
        UNIT_NAME= (un==null?null:un.UNIT_NAME), 
        ActiveStatus= s.ACTIVE_STATUS, 
        HLDY_SPCL_REM= s.HLDY_SPCL_REM 
       } 
       ).ToList(); 
+0

是的,我在找這個,謝謝。 –

+1

Np。很高興幫助 – Arion

+0

我很快就認爲它可以工作,但現在我嘗試了這一點,並得到錯誤,當它不是一個divi_code/unit_code。錯誤說「對象引用未設置爲對象的實例」。 :( –