繁体   English   中英

C#Linq两次联接同一表

[英]c# Linq Join same table twice

使用下面的linq语句,我显示了一个结果列表,该列表连接了两个名为AssetTransferItems和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
// ------------^^^^^^^^^^^^^^^^^^^^^^^

编辑

这个答案中 ,以下应该起作用(为了示例的可读性,我删除了whereorderby子句):

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM