Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c Linq连接同一个表两次_C#_Linq - Fatal编程技术网

C# c Linq连接同一个表两次

C# c Linq连接同一个表两次,c#,linq,C#,Linq,使用下面的linq语句,我显示了一个结果列表,我将其连接到两个名为AssetTransferItems和Memberships的表中。Memberships表包含一个用户列表,其中每个用户都存储为GUID并包含其用户名 现在我想添加另一个名为UserReceived的列,并像UserAdded一样显示用户名而不是GUID。UserReceived=txboxItems.UserReceived当前显示GUID,我正在尝试获取用户名 我不确定如何修改Linq语句以从UserReceived的成员资

使用下面的linq语句,我显示了一个结果列表,我将其连接到两个名为AssetTransferItems和Memberships的表中。Memberships表包含一个用户列表,其中每个用户都存储为GUID并包含其用户名

现在我想添加另一个名为UserReceived的列,并像UserAdded一样显示用户名而不是GUID。UserReceived=txboxItems.UserReceived当前显示GUID,我正在尝试获取用户名

我不确定如何修改Linq语句以从UserReceived的成员资格表中获取用户名。我添加了第二个连接:

join userReceived in Memberships on txboxItems.UserReceived equals userReceived.UserId
但这并没有显示结果

    var query = (from txboxItems in AssetTransferItems
                                        join user in Memberships on txboxItems.UserAdded equals user.UserId
                                        join userReceived in Memberships on txboxItems.UserReceived equals userReceived.UserId

                                     where txboxItems.TransferBoxID == BoxId && txboxItems.Deleted == false
                                    orderby txboxItems.TicketID descending
                                     select new
                                    {
                                        Description = txboxItems.Description.ToString(),
                                        DateAdded = (DateTime?) txboxItems.DateAdded.Value,
                                        UserAdded = user.Username,
                                        DateReceived = (DateTime?) txboxItems.DateReceived.Value,
                                        UserReceived = userReceived.Username,
                                    });
编辑:我更新了linq语句以反映我现在拥有的内容。它显示userReceived.Username,但不显示userReceived为null的所有其他结果

多谢各位

join user in Memberships on txboxItems.UserAdded equals user.UserId
join userReceived in Memberships on txboxItems.UserAdded equals userReceived.UserId
应该是:

join user in Memberships on txboxItems.UserAdded equals user.UserId
join userReceived in Memberships on txboxItems.UserReceived equals userReceived.UserId
// ------------------------------------------------^^^^^^^^
然后您应该能够使用

UserReceived = userReceived.Username
而不是

UserReceived = txboxItems.UserReceived
// ------------^^^^^^^^^^^^^^^^^^^^^^^
编辑

从中,为了示例的可读性,我删除了where和orderby子句:

from txboxItems in AssetTransferItems
from user in Memberships
    .Where(u => u.UserId == txboxItems.UserAdded).DefaultIfEmpty()
from userReceived in Memberships
    .Where(u => u.UserId == txboxItems.UserReceived).DefaultIfEmpty()
select new
{
     Description = txboxItems.Description.ToString(),
     DateAdded = (DateTime?) txboxItems.DateAdded.Value,
     UserAdded = user?.Username,
     DateReceived = (DateTime?) txboxItems.DateReceived.Value,
     UserReceived = userReceived?.Username
}

如果您只想使用“userReceived.Username”执行某些操作,为什么还要第三次加入?为什么不能像使用user.Username一样使用“userReceived.Username”呢?有一个输入错误,很抱歉,添加了一个连接太多次,但被删除了..那么使用userReceived.Username有什么不好的地方呢?就像你使用的user.Username一样?我尝试了userReceived.Username,但结果只有在userReceived不为null时才会显示。我之前尝试过这个,但是,它从未返回任何结果,只返回具有不为null的ReceivedUser的结果。@Belliez我编辑了我的答案,添加了您似乎需要的左连接行为。这很完美,谢谢。我还有一些类似的陈述,我可以重复使用你的例子,再次感谢