2014-01-08 38 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。错误说“对象引用未设置为对象的实例”。 :( –