id name
1  a
2  b
3  c
4  d
id pid name
1  1     aa
2  1     ab
3  2     ba
4  2     bb
5  5     ea
6  6     faresult:
id pname name
1  a     aa,ab
2  b     ba,bb
3  c
4  d
-  -     ed,fa

解决方案 »

  1.   

    你能先把这两张表放到两个List里不,这样给回答问题的人些方便
      

  2.   

    void Main()
    {
    var list1=new List<tb1>
    {
    new tb1{ id=1, name="a"},
    new tb1{ id=2, name="b"},
    new tb1{ id=3, name="c"},
    new tb1{ id=4, name="d"},
    };

    var list2=new List<tb2>
    {
    new tb2{ id=1,pid=1, name="aa"},
    new tb2{ id=2,pid=1, name="ab"},
    new tb2{ id=3,pid=2,name="ba"},
    new tb2{ id=4,pid=2,name="bb"},
    new tb2{ id=5,pid=5,name="ea"},
    new tb2{ id=6,pid=6,name="fa"},
    };

    var query=(from t1 in list1
              join t2 in list2
      on t1.id equals t2.pid into t
      select new  
    {
       id=t==null?"-":t1.id.ToString(),
       pname=t==null?"":t1.name,
       name=t==null?"":string.Join(",",t.Select(x=>x.name).ToArray())
    }).Concat(Enumerable.Range(0,1).Select(s=>
    new 
    {  
       id="-",
       pname="-",
       name=string.Join(",",list2.Where(l=>!list1.Select(x=>x.id).Contains(l.pid)).Select(x=>x.name).ToArray())
     }));
     

    }class tb1
    {
      public int id {get;set;}
      public string name {get;set;}
    }class tb2
    {
      public int id {get;set;}
      public int pid {get;set;}
      public string name {get;set;}
    }
      

  3.   

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;namespace ConsoleApplication1
    {
        class PTable
        {
            public int id { get; set; }
            public string name { get; set; }
        }    class CTable
        {
            public int id { get; set; }
            public int pid { get; set; }
            public string name { get; set; }
        }    class Program
        {
            static void Main(string[] args)
            {
                var list1 = new List<PTable>()
                {
                    new PTable() { id = 1, name = "a" },
                    new PTable() { id = 2, name = "b" },
                    new PTable() { id = 3, name = "c" },
                    new PTable() { id = 4, name = "d" },
                };            var list2 = new List<CTable>()
                {
                    new CTable() { id = 1, pid = 1, name = "aa" },
                    new CTable() { id = 2, pid = 1, name = "ab" },
                    new CTable() { id = 3, pid = 2, name = "ba" },
                    new CTable() { id = 4, pid = 2, name = "bb" },
                    new CTable() { id = 5, pid = 5, name = "ea" },
                    new CTable() { id = 6, pid = 6, name = "fa" },
                };            var query = list1.GroupJoin(list2, x => x.id, x => x.pid, (x, y) => new { id = x.id.ToString(), pname = x.name, name = y.Select(z => z.name) })
                    .Concat(Enumerable.Range(1, 1).Select(x => new { id = "-", pname = "-", name = list2.Where(z => !list1.Select(y => y.id).Contains(z.pid)).Select(z => z.name) }));            foreach (var item in query)
                {
                    Console.WriteLine("{0}\t{1}\t{2}", item.id, item.pname, string.Join(", ", item.name));
                }
            }
        }
    }1       a       aa, ab
    2       b       ba, bb
    3       c
    4       d
    -       -       ea, fa
    Press any key to continue . . .