none
請教LINQ left join RRS feed

  • 問題

  • 各位前輩好

    我已搜尋許多資料,不知2個datatable要如何做left join

    dtPMN 要left outer join dtPQMTAB

    問題1:請教以下這樣寫法會出現值不能為NULL的錯誤 ?

    問題2:另外還少了1個join 條件dtPMN.pmn02 = dtPQMTAB.tab00不知怎寫,

    加上去都會出現錯誤,目前搜尋到的資料都只有一個join

    其實dtPMN及dtPQMTAB是二個不同的DB,我也可以將它們用在同一DB後再下SQL就好

    只是我想學LINQ join 去處理

    可否請前輩指導一下,謝謝


     var query2 =
                            (from erp in dtPMN.AsEnumerable()
                             join ec in dtPQMTAB.AsEnumerable()
                               on erp.Field<string>("pmn01") equals ec.Field<string>("EBOKEY1") into ps
                             from ec in ps.DefaultIfEmpty()
                             where ec.Field<string>("TAB025") != "Y"   
                                 select new
                                 {
                                     pmn01 = erp.Field<string>("pmn01"),
                                     pmn02 = erp.Field<int>("pmn02"),
                                     //tab025 = ec.Field<string>("TAB025")
                                     tab025 = ps.FirstOrDefault() ==null?null:ec.Field<string>("TAB025")
                                 }
                             ).ToList();
    
                        foreach (var item in query2)
                        {
                            Console.WriteLine("pmn01:{0}, pmn02:{1}, tab025:{2}",
                            item.pmn01, item.pmn02, item.tab025);
                        }

    2018年9月27日 上午 01:28

解答

  • 1. 你檢查一下你的資料 特別是 int 這種不能為 NULL 的。

    2.  

     var query2 =
                           (from erp in dtPMN.AsEnumerable()
                            join ec in dtPQMTAB.AsEnumerable()
                              on new { v1 = erp.Field<string>("pmn01") , v2 = erp.Field<string>("pmn02") }  equals new { v1 = ec.Field<string>("EBOKEY1") , v2 = ec.Field<string>("tab00") }
                              into ps
                            from ec in ps.DefaultIfEmpty()
                            where ec.Field<string>("TAB025") != "Y"
                            select new
                            {
                                pmn01 = erp.Field<string>("pmn01"),
                                pmn02 = erp.Field<int>("pmn02"),
                                 //tab025 = ec.Field<string>("TAB025")
                                 tab025 = ps.FirstOrDefault() == null ? null : ec.Field<string>("TAB025")
                            }
                            ).ToList();

    • 已標示為解答 effor 2018年10月2日 上午 02:25
    2018年9月27日 上午 07:48

所有回覆

  • 1. 你檢查一下你的資料 特別是 int 這種不能為 NULL 的。

    2.  

     var query2 =
                           (from erp in dtPMN.AsEnumerable()
                            join ec in dtPQMTAB.AsEnumerable()
                              on new { v1 = erp.Field<string>("pmn01") , v2 = erp.Field<string>("pmn02") }  equals new { v1 = ec.Field<string>("EBOKEY1") , v2 = ec.Field<string>("tab00") }
                              into ps
                            from ec in ps.DefaultIfEmpty()
                            where ec.Field<string>("TAB025") != "Y"
                            select new
                            {
                                pmn01 = erp.Field<string>("pmn01"),
                                pmn02 = erp.Field<int>("pmn02"),
                                 //tab025 = ec.Field<string>("TAB025")
                                 tab025 = ps.FirstOrDefault() == null ? null : ec.Field<string>("TAB025")
                            }
                            ).ToList();

    • 已標示為解答 effor 2018年10月2日 上午 02:25
    2018年9月27日 上午 07:48
  • 1. 你檢查一下你的資料 特別是 int 這種不能為 NULL 的。

    2.  

     var query2 =
                           (from erp in dtPMN.AsEnumerable()
                            join ec in dtPQMTAB.AsEnumerable()
                              on new { v1 = erp.Field<string>("pmn01") , v2 = erp.Field<string>("pmn02") }  equals new { v1 = ec.Field<string>("EBOKEY1") , v2 = ec.Field<string>("tab00") }
                              into ps
                            from ec in ps.DefaultIfEmpty()
                            where ec.Field<string>("TAB025") != "Y"
                            select new
                            {
                                pmn01 = erp.Field<string>("pmn01"),
                                pmn02 = erp.Field<int>("pmn02"),
                                 //tab025 = ec.Field<string>("TAB025")
                                 tab025 = ps.FirstOrDefault() == null ? null : ec.Field<string>("TAB025")
                            }
                            ).ToList();

    老師您好

    謝謝您的回覆,雖然知道多條件join的寫法,但還是會出現值不能為null的錯誤訊息

    dtPMN left join dtPQMTAB 因為dtPQMTAB沒資料

    我的疑問是,我查詢的欄位不管有無dtPQMTAB.TAB025 (TAB025為varchar) 

    以及有寫以下

    from ec in ps.DefaultIfEmpty() 

    where ec.Field<string>("TAB025") == "Y"

    還是會出現值不能為null

    如果不加where ec.Field<string>("TAB025") == "Y"是沒問題的

    還是說因為left join的結果有null 所以不能寫這個where 條件 ?

    我應該寫inner join  ? 謝謝

     var query2 =
                            (from erp in dtPMN.AsEnumerable()
                                join ec in dtPQMTAB.AsEnumerable()
                                on new { v1 = erp.Field<string>("pmn01"), v2 = erp.Field<int>("pmn02") }
    
                                equals new { v1 = ec.Field<string>("EBOKEY1"), v2 = ec.Field<int>("TAB001") } into ps
                                from ec in ps.DefaultIfEmpty()
                                where ec.Field<string>("TAB025") == "Y"      //PQMTAB tab025會有null                   
    
                                select new
                                {
                                    //pmn01 = erp.Field<string>("pmn01"),
                                    //pmn02 = erp.Field<int>("pmn02"),
                                    //tab025 = ps.FirstOrDefault() == null ? null : ec.Field<string>("TAB025")                            
                                }
                                );
    
                        foreach (var item in query2)
                        {
                            //Console.WriteLine("pmn01:{0}, pmn02:{1}, tab025:{2}",
                            //item.pmn01, item.pmn02, item.tab025);
                        }

    2018年9月30日 上午 02:07