【问题标题】:c# Linq Join same table twicec# Linq 两次加入同一张表
【发布时间】:2018-03-02 13:58:56
【问题描述】:

使用下面的 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 的所有其他结果。

谢谢

【问题讨论】:

  • 如果您只想使用 'userReceived.Username? Why can't you use 'userReceived.Username 做某事,就像您使用 user.Username 一样,为什么还要第三次加入?
  • 有一个错字,对不起,添加了太多次被删除..
  • 那么像使用 user.Username 一样使用 userReceived.Username 有什么不妥?
  • 我试过 UserReceived.Username 但结果只会在 UserReceived 不为空时显示。

标签: c# linq


【解决方案1】:
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
// ------------^^^^^^^^^^^^^^^^^^^^^^^

编辑

this answer 开始,以下内容应该可以工作(我删除了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
}

【讨论】:

  • 我之前尝试过,但它从未返回任何结果,只返回“ReceivedUser”不为空的结果。
  • @Belliez 我编辑了我的答案以添加您似乎需要的 left join 行为
  • 这是完美的,谢谢。我还有其他一些类似的语句,我可以重复使用您的示例,再次感谢
猜你喜欢
  • 2016-04-05
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2014-09-15
  • 2014-03-17
  • 2015-04-04
  • 2012-08-22
  • 2010-09-17
相关资源
最近更新 更多