C# c Linq连接同一个表两次
使用下面的linq语句,我显示了一个结果列表,我将其连接到两个名为AssetTransferItems和Memberships的表中。Memberships表包含一个用户列表,其中每个用户都存储为GUID并包含其用户名 现在我想添加另一个名为UserReceived的列,并像UserAdded一样显示用户名而不是GUID。UserReceived=txboxItems.UserReceived当前显示GUID,我正在尝试获取用户名 我不确定如何修改Linq语句以从UserReceived的成员资格表中获取用户名。我添加了第二个连接:C# c Linq连接同一个表两次,c#,linq,C#,Linq,使用下面的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我编辑了我的答案,添加了您似乎需要的左连接行为。这很完美,谢谢。我还有一些类似的陈述,我可以重复使用你的例子,再次感谢