如何使用LINQ编写外部联接

时间:2013-10-31 20:48:25

标签: c# linq datatable

我使用下面的Inner Join来检索两个表之间的数据,但是没有填充所有数据。我尝试使用CCY1 == CCY1和PCODE == PCODE连接实现外连接,但没有运气。

enter image description here

    var q = from g1 in TableCCY1.AsEnumerable()
            join g2 in TableCCY2.AsEnumerable()
            on g1.Field<string>("CCY1") equals g2.Field<string>("CCY1") 
            where  g1.Field<string>("PCODE") == g2.Field<string>("PCODE")
                   select new
                     {
                             g1currency = g1.Field<string>("CCY1"),
                             g2currency = g2.Field<string>("CCY1"),
                             g1code = g1.Field<string>("PCODE"),
                             g2code = g2.Field<string>("PCODE"),
                             g1Amt1 = g1.Field<string>("AMT1"),
                             g2Amt2 = g2.Field<string>("AMT2")
                     };

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

对于左连接,您可以使用以下方法:http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx

代码应为:

var q = from g1 in TableCCY1
            join g2 in TableCCY2 on g1.CCY1 equals g2.CCY1 && g1.PCODE equals g2.PCODE into TableCCY3
from g3 in TableCCY3.DefaultIfEmpty()
 select new
                     {
                             g1currency = g1.CCY1,
                             g2currency = (g3 == null ? String.Empty : g3.CCY1),
                             g1code = g1.PCODE,
                             g2code = (g3 == null ? String.Empty : g3.PCODE),
                             g1Amt1 = g1.AMT1,
                             g2Amt2 = (g3 == null ? 0 : g3.AMT2)
                     };

答案 1 :(得分:1)

看起来你只想将两个表联合/连接成一个,然后只对这两个列进行分组。你没有逻辑上加入这两个表。这实际上使它更容易。

var q = from row in TableCCY1.AsEnumerable().Concat(TableCCY2.AsEnumerable())
        group row by new
        {
            CCY1 = row.Field<string>("CCY1"),
            PCode = row.Field<string>("PCODE")
        } into matches
        select new
        {
            CCY1 = matches.Key.CCY1,
            PCODE = matches.Key.PCode,
            Sum = matches.Sum(match => match.Field<decimal?>("AMT2")),
        };