C# - 如果查询中存在空值,则使用Linq获取数据

时间:2016-11-12 08:48:33

标签: c# linq datatable

我有两个数据表,

var userList1 = from myRow in dt.AsEnumerable()
                where myRow.Field<bool?>("IsActive1") == null 
                      ? true 
                      : myRow.Field<bool?>("IsActive1") == true
                select myRow;

var userList2 = from myRow in dt1.AsEnumerable()
                select myRow;

dt1表格显示如下,

enter image description here

使用此Linq查询,

var objUserSetUp1 = (from A in userList1
                     join B in userList2 
                     on new 
                     { 
                         UserId = A.Field<Int64?>("Id") == null 
                                      ? 0 
                                      : A.Field<Int64>("Id") 
                     } 
                     equals new 
                     { 
                         UserId = B.Field<Int64?>("UserId") == null 
                                      ? 0 
                                      : B.Field<Int64>("UserId") 
                     }
                     select new
                     {
                         UserId = A.Field<Int64>("Id"),
                         FirstName = A.Field<string>("FirstName"),
                         SurName = A.Field<string>("SurName"),
                         Computer_Name = A.Field<string>("Computer_Name"),
                         IP_Address = A.Field<string>("IP_Address"),
                         LogInTime = A.Field<string>("LogInTime") == null 
                                          ? "UnKnown" 
                                          : A.Field<string>("LogInTime"),
                         UserName = A.Field<string>("UserName"),
                         Password = A.Field<string>("Password"),
                         login_Id = A.Field<Int64?>("login_Id") == null 
                                        ? 0 : 
                                        A.Field<Int64?>("login_Id"),
                         docCount = B.Field<Int64>("docCount")
                     }).ToList();

如果UserId为null,我怎样才能获取docCout字段值。我怎样才能在查询中执行此操作?

1 个答案:

答案 0 :(得分:1)

我认为你需要一个Left Outer Join,其中外连接的默认值(即不存在匹配记录时)是userList2条目Field("UserId")null

见下文(未经测试,但你明白了!):

    var objUserSetUp1 = (from A in userList1
                        join B in userList2 
                            on A.Field<Int64?>("Id") equals B.Field<Int64?>("UserId")
                            into BGroup
                        from C in BGroup.DefaultIfEmpty(userList2.Single(u => u.Field<Int64?>("UserId") == null))
                        select new
                        {
                            UserId = A.Field<Int64>("Id"),
                            FirstName = A.Field<string>("FirstName"),
                            SurName = A.Field<string>("SurName"),
                            Computer_Name = A.Field<string>("Computer_Name"),
                            IP_Address = A.Field<string>("IP_Address"),
                            LogInTime = A.Field<string>("LogInTime") == null
                                            ? "UnKnown"
                                            : A.Field<string>("LogInTime"),
                            UserName = A.Field<string>("UserName"),
                            Password = A.Field<string>("Password"),
                            login_Id = A.Field<Int64?>("login_Id") == null
                                        ? 0 :
                                        A.Field<Int64?>("login_Id"),
                            docCount = C.Field<Int64>("docCount")
                        }).ToList();