2014-01-27 79 views
0

我做左连接和右连接,然后进行全外办联合联接这里是我的代码全外连接的Linq

var brndT = (from a in db.TSA_TARGET_DETAIL 
         where a.OUTLET_ID == id && a.CAMPAIGN_ID == campaignId && a.EMPLOYEE_ID == empId 
         select new 
         { 
          ID=a.BRAND_ID, 
          Target=a.STICK_QTY 
         }).ToList(); 

      var brndS = (from p in db.SR_TRN_DETAILS 
         where 
          (from ppt in db.SR_TRN_MAIN 
          where 
          ppt.MEMO_DATE >= d2 && ppt.MEMO_DATE <= d1 && ppt.OUTLET_ID==id 
          select ppt.ORDER_ID).Contains(p.ORDER_ID) 
         group p by p.BRAND_ID into g 
         select new 
         { 
          ID = g.Key, 
          Qty = g.Select(x => x.QUANTITY).Sum() 
         }).ToList(); 
      var left = (from T in brndT 
         join S in brndS 
         on T.ID equals S.ID 
         into temp 
         from S in temp.DefaultIfEmpty() 
         select new BrandSalesTarget 
         { 
          ID=T.ID, 
          Target = T.Target==null?0:(int)T.Target, 
          Sales = S != null ? (int)S.Qty : 0, 
         }).ToList(); 
      var right = (from S in brndS 
         join T in brndT 
         on S.ID equals T.ID 
         into temp 
         from T in temp.DefaultIfEmpty() 
         select new BrandSalesTarget 
         { 
          ID=S.ID, 
          Sales = S.Qty==null?0:(int)S.Qty, 
          Target = T != null ? (int)T.Target : 0 
         }).ToList(); 
      var fullOuter = left.Union(right).ToList(); 

但工会不起作用。我得到了两次相同的ID。我的代码有什么问题?任何人的帮助,不胜感激。提前致谢。

+0

所有的事情似乎都没问题,如果你从最后一行删除'.ToList'就像这样:'var fullOuter = left.Union(right);' – Hamidreza

+0

我没有时间调查,但我的一个最初的猜测是班级'BrandSalesTarget'不知道如何比较自己。或者你需要一个比较器,如下所示:http://stackoverflow.com/questions/5969505/using-iequalitycomparer-for-union – TTT

回答

0

尝试使用IEqualityComparer,以便联合知道哪些元素相同。

借用的代码。 union in two linq statements and remove the duplicate

class FirstElementComparer : IEqualityComparer<string[]> 
{ 
    //TODO error checking 
    public bool Equals(string[] a, string[] b) 
    {  
     return a[0].Equals(b[0]); 
    } 

    public Int32 GetHashCode(string[] obj) 
    { 
     return obj[0].GetHashCode(); 
    } 
} 

,并使用它像这样:

void Main() 
{ 
    string[][] query1 = {new [] {"this is a test","Yes", "This is a remark"}, 
         new [] {"this is a test2","No", "This is the second remark"}}; 

    string[][] query2 = {new [] {"this is a test","",""}, 
         new [] {"this is a test2","",""}, 
         new [] {"this is a test3","",""}, 
         new [] {"this is a test4","",""}}; 

    query1.Union(query2, new FirstElementComparer()).Dump();       
} 

的EqualityComparer用于通过联盟在QUERY1的元素,其QUERY2的元素进行比较。它通过比较每个数组中的第一项来实现。

我将来请简化您的代码以显示实际问题的最少行数,理想情况下可以运行一个完整的简短程序的形式,可以运行而不是复制和粘贴任何助手将会拥有的大量生产代码用来重现问题的麻烦。