通过Linq连接多个表

通过Linq连接多个表,linq,join,left-join,Linq,Join,Left Join,我有三张桌子,分别是球员、球员和球队。我想写一个linq语句,比如 from p in Player join d in PlayerDetails on p.ID equals d.PID 然后右键连接团队表,玩家有一个名为TID的列,它面对团队表的ID 我试着写一个像这样的声明 from p in Player join d in PlayerDetails on p.ID equals d.PID into PlayerGroup from t in team join g in Pla

我有三张桌子,分别是球员、球员和球队。我想写一个linq语句,比如

from p in Player join d in PlayerDetails on p.ID equals d.PID
然后右键连接团队表,玩家有一个名为TID的列,它面对团队表的ID

我试着写一个像这样的声明

from p in Player join d in PlayerDetails on p.ID equals d.PID into PlayerGroup
from t in team join g in PlayerGroup on t.ID equals g.p.ID
这肯定行不通。我不知道如何编写这种类型的查询语句,表左连接表2,然后右连接表3


谁能帮忙?

我相信你可以这样做:

var LeftJoin =
    from p in Player
    join d in PlayerDetails on p.ID equals d.PID into pd
    from d in pd.DefaultIfEmpty()
    select new
    {
        pID = p.ID,
        pTID = p.TID,
        dID = d.ID
    };

var RightJoin =
    from t in Team
    join l in LeftJoin on t.ID equals l.pTID into tl
    from l in tl.DefaultIfEmpty()
    select new
    {
        tID = t.ID,
        pID = l.pID,
        pTID = l.PTID,
        dID = l.dID
    };
var RightJoin =
    from t in Team
    join l in
        (from p in Player
         join d in PlayerDetails on p.ID equals d.PID into pd
         from d in pd.DefaultIfEmpty()
         select new
         {
             pID = p.ID,
             pTID = p.TID,
             dID = d.ID
         })
    on t.ID equals l.pTID into tl
    from l in tl.DefaultIfEmpty()
    select new
    {
        tID = t.ID,
        pID = l.pID,
        pTID = l.PTID,
        dID = l.dID
    };
要在一个查询中完成所有操作,我认为您可以执行(未经测试)如下操作:

var LeftJoin =
    from p in Player
    join d in PlayerDetails on p.ID equals d.PID into pd
    from d in pd.DefaultIfEmpty()
    select new
    {
        pID = p.ID,
        pTID = p.TID,
        dID = d.ID
    };

var RightJoin =
    from t in Team
    join l in LeftJoin on t.ID equals l.pTID into tl
    from l in tl.DefaultIfEmpty()
    select new
    {
        tID = t.ID,
        pID = l.pID,
        pTID = l.PTID,
        dID = l.dID
    };
var RightJoin =
    from t in Team
    join l in
        (from p in Player
         join d in PlayerDetails on p.ID equals d.PID into pd
         from d in pd.DefaultIfEmpty()
         select new
         {
             pID = p.ID,
             pTID = p.TID,
             dID = d.ID
         })
    on t.ID equals l.pTID into tl
    from l in tl.DefaultIfEmpty()
    select new
    {
        tID = t.ID,
        pID = l.pID,
        pTID = l.PTID,
        dID = l.dID
    };

我相信你可以这样做:

var LeftJoin =
    from p in Player
    join d in PlayerDetails on p.ID equals d.PID into pd
    from d in pd.DefaultIfEmpty()
    select new
    {
        pID = p.ID,
        pTID = p.TID,
        dID = d.ID
    };

var RightJoin =
    from t in Team
    join l in LeftJoin on t.ID equals l.pTID into tl
    from l in tl.DefaultIfEmpty()
    select new
    {
        tID = t.ID,
        pID = l.pID,
        pTID = l.PTID,
        dID = l.dID
    };
var RightJoin =
    from t in Team
    join l in
        (from p in Player
         join d in PlayerDetails on p.ID equals d.PID into pd
         from d in pd.DefaultIfEmpty()
         select new
         {
             pID = p.ID,
             pTID = p.TID,
             dID = d.ID
         })
    on t.ID equals l.pTID into tl
    from l in tl.DefaultIfEmpty()
    select new
    {
        tID = t.ID,
        pID = l.pID,
        pTID = l.PTID,
        dID = l.dID
    };
要在一个查询中完成所有操作,我认为您可以执行(未经测试)如下操作:

var LeftJoin =
    from p in Player
    join d in PlayerDetails on p.ID equals d.PID into pd
    from d in pd.DefaultIfEmpty()
    select new
    {
        pID = p.ID,
        pTID = p.TID,
        dID = d.ID
    };

var RightJoin =
    from t in Team
    join l in LeftJoin on t.ID equals l.pTID into tl
    from l in tl.DefaultIfEmpty()
    select new
    {
        tID = t.ID,
        pID = l.pID,
        pTID = l.PTID,
        dID = l.dID
    };
var RightJoin =
    from t in Team
    join l in
        (from p in Player
         join d in PlayerDetails on p.ID equals d.PID into pd
         from d in pd.DefaultIfEmpty()
         select new
         {
             pID = p.ID,
             pTID = p.TID,
             dID = d.ID
         })
    on t.ID equals l.pTID into tl
    from l in tl.DefaultIfEmpty()
    select new
    {
        tID = t.ID,
        pID = l.pID,
        pTID = l.PTID,
        dID = l.dID
    };

嗨,奥卢·布伦,谢谢你的回复。我知道它确实很有效,但是,我能写一份声明而不是两份吗?嗨,奥勒布鲁恩,谢谢你的回复。我知道它确实很管用,但是,我能写一句而不是两句吗?