首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

高分,用LINQ兑现这样的查询

2013-09-05 
高分,用LINQ实现这样的查询id name1a2b3c4did pid name11aa21ab32ba42bb55ea66faresult:id pname name1aaa

高分,用LINQ实现这样的查询
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     fa

result:
id pname name
1  a     aa,ab
2  b     ba,bb
3  c
4  d
-  -     ed,fa
[解决办法]
你能先把这两张表放到两个List里不,这样给回答问题的人些方便
[解决办法]

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;}
}


[解决办法]
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 . . .

热点排行