【问题标题】:LINQ to Dataset Left Join, how to Count nullsLINQ to Dataset Left Join,如何计算空值
【发布时间】:2009-06-03 03:52:42
【问题描述】:

首先,看看这个帖子

LINQ to Dataset DBNULL problem / null reference exception

上面的链接为您提供了如何 LEFT JOIN 然后选择其中具有 NULL 值的列而不会出现异常错误。

我的问题是我想在 WHERE 子句中计算该列是否为空(在我的 LEFT JOIN 之后,列中会弹出一些 NULL 值),如下所示:

int tmp1 = 
(
from n in dt_query
join m in dt_query2 
on n.Field<string>("VC_CLIENT_MAXID") equals m.Field<string>("VC_CHAT_MAXID") into nm
from m in nm.DefaultIfEmpty()
where 
    //string.IsNullorEmpty(m.Field<string>("VC_CHAT_STAFF"))
    //DBNull.Value.Equals(m.Field<string>("VC_CHAT_STAFF"))
    //m.IsNull("VC_CHAT_STAFF")
    //object.Equals(m.Field<string>("VC_CHAT_STAFF"), xxx) <<< String xxx = null on above
    select n.Field<string>("VC_CLIENT_MAXID")
    ).Count();

注释行是我尝试过的解决方案,但对我不起作用。任何帮助将不胜感激。

【问题讨论】:

    标签: linq


    【解决方案1】:

    如果您要问的是如何计算连接表为空的记录数,请尝试一下。

    int tmp1 = 
        (
        from n in dt_query
        join m in dt_query2 
        on n.Field<string>("VC_CLIENT_MAXID") 
            equals m.Field<string>("VC_CHAT_MAXID") into nm
    
        from LeftJoinM in nm.DefaultIfEmpty()
        where 
    
            LeftJoinM  == null
    
        select n.Field<string>("VC_CLIENT_MAXID")
        ).Count();
    

    如果我误解了你,请在评论中告诉我,我很乐意更新。

    【讨论】:

    • 这对我有用(这次)!但我有件事要问你。 “m == null”是什么意思?我认为过滤掉指定列中的 NULL 不适用于此(因为我不知道我检查了哪一列是否为 NULL)。如果表 A 有要加入的 VC_CLIENT_MAXID 并且表 B 中的 VC_CHAT_STAFF 从一开始就是 NULL 怎么办?我想我会得到错误的答案?
    • 我已将 m 重命名为“LeftJoinM”以使其更清晰。 “m == null”或现在的“LeftJoinM == null”基本上检查连接是否失败。它返回所有无法加入的记录。
    • SELECT COUNT(*) FROM VC_CLIENT LEFT JOIN VC_CHAT ON VC_CLIENT_MAXID = VC_CHAT_MAXID WHERE VC_CHAT_STAFF IS NULL > 我的观点是“m == null”不是翻译此查询的完美答案。如您所见,如果 VC_CHAT 中有 VC_CHAT_STAFF 空数据,我无法选择它,因为“m == null”只能为我提供连接失败的行。我对吗 ?您将如何将此查询转换为 LINQ 语法?因为当我尝试在 WHERE 子句中调用 "m.Field("VC_CHAT_STAFF")" 时得到 NullException 无论如何,非常感谢您的上述回答。它对我有很大帮助!
    【解决方案2】:

    我还没有测试以下代码..希望这应该工作

    int tmp1 = 
            (
            from n in dt_query
            join m in dt_query2 
            on n.Field<string>("VC_CLIENT_MAXID") 
                equals m.Field<string>("VC_CHAT_MAXID") into nm
    
            from temp in nm.where(t => t.Field<string>("VC_CLIENT_MAXID") ==null).DefaultIfEmpty()
    
    
            select VC_CLIENT_MAXID=  (temp== null) ? "" :n.Field<string>("VC_CLIENT_MAXID");
            ).Count();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多