LINQ 内连接+右连接

夜色镇歌 2013-08-15 02:06:09
朋友问我一个问题,三张表 A B C A和B内连接,然后和C右链接 A的主键Id B和C中的AId 是外键,我这么写对不对?? 还有没有更好的写法??


using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<A> aas = new List<A>()
{
new A(){ Id=1, AName="AName1"},
new A(){ Id=2, AName="AName2"},
new A(){ Id=3, AName="AName3"},
new A(){ Id=4, AName="AName4"},
};

List<B> bbs = new List<B>()
{
new B(){ AId=1, BName="BName1"},
new B(){ AId=2, BName="BName2"},
new B(){ AId=3, BName="BName3"},
new B(){ AId=4, BName="BName4"},
};

List<C> ccs = new List<C>()
{
new C(){ AId=1, CName="CName1"},
new C(){ AId=2, CName="CName2"},
new C(){ AId=3, CName="CName3"},
new C(){ AId=4, CName="CName4"},
new C(){ AId=5, CName="CName5"}
};

var query = from a in aas
join b in bbs on a.Id equals b.AId into d
from e in d.DefaultIfEmpty()
select new
{
aId = a.Id,
aName = a.AName,
bName = e.BName
};

var query2 = ccs.Select(x => new
{
Aid = x.AId,
CName = x.CName,
AName = query.SingleOrDefault(s => s.aId == x.AId) == null ? null : query.SingleOrDefault(s => s.aId == x.AId).aName,
BName = query.SingleOrDefault(s => s.aId == x.AId) == null ? null : query.SingleOrDefault(s => s.aId == x.AId).bName
});
Console.Read();
}

}

public class A
{
public int Id { get; set; }
public string AName { get; set; }
}

public class B
{
public int AId { get; set; }
public string BName { get; set; }
}

public class C
{
public int AId { get; set; }
public string CName { get; set; }
}
}

...全文
125 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
q107770540 2013-08-15
  • 打赏
  • 举报
回复
因为你的查询,最终要右连接C表,所以要以C表为基础进行查询 参考3楼我的答案 A和表的连接其实已经放到了SELECT里
夜色镇歌 2013-08-15
  • 打赏
  • 举报
回复
引用 3 楼 q107770540 的回复:
	       var query =  from c in ccs 
	                    join a in aas on c.AId equals a.Id into t
						from a in t.DefaultIfEmpty()  
						select new
								   {
									   Aid = c.AId,
									   CName =c.CName,
									   AName =a==null?"":a.AName,
									   BName =a==null?"":bbs.SingleOrDefault(b=>b.AId==a.Id).BName
								   };
好像A和B不用连接?? 督察大大,我在写的时候

            var query = from a in aas
                        join b in bbs on a.Id equals b.AId into d
                        from e in d.DefaultIfEmpty()
                        select new
                                   {
                                       aId = a.Id,
                                       aName = a.AName,
                                       bName = e.BName
                                   };
 
            var query2 = ccs.Select(x => new
                                             {
                                                 Aid = x.AId,
                                                 CName = x.CName,
                                                 AName = query.SingleOrDefault(s => s.aId == x.AId) == null ? null : query.SingleOrDefault(s => s.aId == x.AId).aName,
                                                 BName = query.SingleOrDefault(s => s.aId == x.AId) == null ? null : query.SingleOrDefault(s => s.aId == x.AId).bName
                                             });
想把这两句写成一句 要怎么写?
q107770540 2013-08-15
  • 打赏
  • 举报
回复
	       var query =  from c in ccs 
	                    join a in aas on c.AId equals a.Id into t
						from a in t.DefaultIfEmpty()  
						select new
								   {
									   Aid = c.AId,
									   CName =c.CName,
									   AName =a==null?"":a.AName,
									   BName =a==null?"":bbs.SingleOrDefault(b=>b.AId==a.Id).BName
								   };
夜色镇歌 2013-08-15
  • 打赏
  • 举报
回复
引用 1 楼 q107770540 的回复:
三张表 A B C A和B内连接, 然后和C右链接 A的主键Id B和C中的AId 是外键 最终想要什么样的结果?
A和B内连接之后是A和B所有字段的数据,然后右连接C 是C中的所有数据都要 还需要A和B内连之后A和B的一些字段的数据吧。。语文不好,也不知道说清楚了没有
q107770540 2013-08-15
  • 打赏
  • 举报
回复
三张表 A B C A和B内连接, 然后和C右链接 A的主键Id B和C中的AId 是外键 最终想要什么样的结果?

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧