【问题标题】:LINQ Left outer join - Object reference not set to an instance of an objectLINQ 左外连接 - 对象引用未设置为对象的实例
【发布时间】:2016-08-01 08:56:14
【问题描述】:

我有两个查询,如下所示:

var ret = (from x in _context.CustomUsers
            where x.Name != currentUser
            join c in _context.Claims on x.Name equals c.UserID into m
            from c in m.DefaultIfEmpty()
            select new UsersClients
            {
                UserName = x.Name,
                DefaultClient = "N/A",
                Role = null
            }).ToList();

这会返回一个像这样的列表:

User1   N/A   null
User2   N/A   null
User3   N/A   null

为此:

var q = (from x in _context.Claims
            where x.Default == true
            select new
            {
                x.UserID,
                x.ClientName
            }).ToList();

这会返回一个像这样的列表:

User1   Client1
User2   Client3

第一个查询返回第二个查询中不存在的用户。然后我想对两个结果进行左外连接,这样我就可以从第二个查询中拉出客户端,如果它是空的。用字符串替换它。

我的第三个查询如下所示:

var p = (from x in ret
            join o in q on x.UserName equals o.UserID into l
            from s in l.DefaultIfEmpty()
            select new UsersClients
            {
                UserName = x.UserName,
                DefaultClient = (s.ClientName == null ? "God dammit work" : s.ClientName),
                Role = null
            }).ToList();

我知道它为什么会失败,只是不知道如何修复它。任何人都可以帮助我,最终结果如下所示:

    User1   Client2   null
    User2   Client1  null
    User3   Work dammit   null

【问题讨论】:

标签: c# entity-framework linq left-join


【解决方案1】:

如果l 为空,则s 似乎已经是null。所以你也需要检查s 是否有null

DefaultClient = (s == null || s.ClientName == null ? "God dammit work": s.ClientName),

或在 C# 6 中使用空合并运算符:

DefaultClient = s?.ClientName ?? "God dammit work",

【讨论】:

  • 这会为真正有客户的人返回“该死的工作”
  • 如果ss.ClientName 为空,则仅返回“该死的工作”。你确定你的查询是正确的吗?也许UserNameUserID 的连接不正确?
  • 我刚刚检查过,连接很好,s.ClientName 不为空。这很奇怪。它只为一个用户做这件事
  • 抱歉,连接不正确。我有一个小写字符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
相关资源
最近更新 更多