【问题标题】:Full outer join Linq全外连接 Linq
【发布时间】:2014-01-27 10:15:18
【问题描述】:

我先做左连接和右连接,然后再做联合以实现完全外连接,这是我的代码

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。我的代码有什么问题?非常感谢任何人的帮助。提前致谢。

【问题讨论】:

  • 一切看起来都还不错,如果你像这样从最后一行删除.ToList 怎么样:var fullOuter = left.Union(right);
  • 我没有时间调查,但我的第一个猜测是“BrandSalesTarget”类不知道如何比较自己。或者您需要一个比较器,如:stackoverflow.com/questions/5969505/…

标签: c# sql linq


【解决方案1】:

尝试使用 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();                         
}

Union 使用 EqualityComparer 将 query1 中的元素与 query2 中的元素进行比较。它仅通过比较每个数组中的第一项来实现。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 2015-06-23
    • 2015-03-31
    • 2012-07-27
    • 2011-08-10
    • 1970-01-01
    • 2014-08-07
    • 2018-05-30
    相关资源
    最近更新 更多