【问题标题】:Update linq query results更新 linq 查询结果
【发布时间】:2018-06-04 10:47:54
【问题描述】:

下面的代码在Users 表上有一个联接(错误),它只给我AssignedUserId 不是null 的记录。无论AssignerUserId如何,我都需要Request中的所有记录,然后当AssignedUserId不是null时添加User.Name。

var query = from r in _context.Request
    join st in _context.ServiceType on r.ServiceTypeId equals st.ServiceTypeId
    join u in _context.Users on r.UserId equals u.UserId
    select new RequestDto
    {
        RequestId = r.RequestId,
        UserId = r.UserId,
        FirstName = r.FirstName,
        //...
        ServiceType = st.ServiceName,
        AssignedUserId = r.AssignedUserId,
        AssignedUser = u.Name
    };

return query.ToList();

如何仅获取AssignedUserId 不是null 的记录的User.Name?

【问题讨论】:

  • 问题不清楚... Users 表(错误) 是什么意思? r.AssignedUserId 与 r.UserId 相比是什么?
  • 这里是否有错误“on r.UserId equals u.UserId”? .也许它会是“在 r.AssignedUserId 上等于 u.UserId”?
  • by(错误)我的意思是这个查询只返回 AssignedUserId 不为空的记录

标签: c# linq


【解决方案1】:

您想要的是左连接 - 从请求中检索数据,但仅在可能的情况下加入 Users 表:

var query = from r in _context.Request
    join st in _context.ServiceType on r.ServiceTypeId equals st.ServiceTypeId
    join u in _context.Users on r.AssignedUserId equals u.UserId into ju
    from u in ju.DefaultIfEmpty()
    select new RequestDto
    {
        // ....
        AssignedUserId = r.AssignedUserId,
        AssignedUser = u?.Name
    };

至于您在 cmets 中的例外情况,请参阅 an expression tree lambda may not contain a null propagating operator。

将u.Name 替换为u == null ? null : u.Name

【讨论】:

  • 我不确定是什么?在 u?.Name 中...。当我尝试这个解决方案时,我收到一个错误,“表达式树 lambda 可能不包含空传播运算符。”当我拿出 ?我仍然只是获取包含 AssignedUserId 的记录。
  • 另外,在查看结果集时,我的AssignedUserId实际上等于0。它不为null。没有 UserId = 0。如何仅在 AssignedUserId > 0 时使用此左连接和查找用户?
  • 相同的查询...我怎样才能将 AssignedDate 和 DateTime.Now 的 datediff 也放入 AssignedElapsed 中? IE; AssignedElapsed = DateDiff(r.AssignedDate.Value, DateTime.Now)
  • @P-Finny - 这是一个后续问题,很遗憾我不应该在这里回答它。请在线搜索类似的问题或参考资料,如果你不能解决它,那么你可以发布一个新问题
【解决方案2】:

你要执行left join

        var query = from r in _context.Request
            join st in _context.ServiceType on r.ServiceTypeId equals st.ServiceTypeId
            join u in _context.Users on r.AssignedUserId equals u.UserId into ps
            from u in ps.DefaultIfEmpty()
            select new RequestDto
            {
                RequestId = r.RequestId,
                UserId = r.UserId,
                FirstName = r.FirstName,
                ServiceType = st.ServiceName,
                AssignedUserId = r.AssignedUserId,
                AssignedUser = u?.Name
            };

我假设加入 Users 条件是 "r.AssignedUserId"。此外,使用导航属性而不是手动加入可能会更好。

【讨论】:

    【解决方案3】:

    试试

    AssignedUser = r.AssignedUserId == null ? null : u.Name
    

    如果您不想将 AssignedUser 设置为 null,则可以将其设置为 String.Empty。

    【讨论】:

    • 可以简化为AssignedUser = r.AssignedUserId ?? u.Name
    • @FCin:你的建议不是一回事。你写的内容是:如果 r.AssignedUserId 为空,则使用 u.Name,否则使用 r.AssignedUserId。不是用户要问的。见:stackoverflow.com/questions/446835/…
    猜你喜欢
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多