C#SQL To Linq - 具有多个变量的子句比较(var1 + var2)!=(var1 + var2)

时间:2011-09-29 21:22:16

标签: c# linq list anonymous-types

我有这些在sql中工作的大数据集工作得很好。但是我很难转换为linq - 我是linq的新手

Select * from table1 t1, table2 t2 where (t1.RoleId+t1.UserId)!=(t2.RoleId+t2.UserId)

另一方面,当两个变量分开时,我得到了不希望的结果。

含义如下:where (t1.RoleId != t2.RoleId && t1.UserId != t2.UserId)

在c#中我有两个匿名列表。最后一个linq语句很有效,直到空白进入图片。什么都没有回来。我甚至想过使用左连接但没有成功。

那么您如何使用匿名类型列表解决上述问题?

我到目前为止Linq的评论

var roleUserList =
(
       from rls in roleResouceList
       join user in userResourceList
       on rls.FullResource.ToUpper() equals user.FullResource.ToUpper()
       orderby rls.RoleID, user.UserID, rls.Res1, rls.Res2, rls.Res3                   
       select new
       {
            RoleID = rls.RoleID,
            UserID = user.UserID,
            ServerId = rls.ServerID,
            FullResource = rls.FullResource,
            RlsRes1 = rls.Res1,
            RlsRes2 = rls.Res2,
            RlsRes3 = rls.Res3
        }).Distinct().ToList();


 var missingRoleUserList =
  (
          from rls in rlsCount
          join usr in usrCount
          on rls.Res1 equals usr.Res1
          where rls.Total > usr.Total
          select new
                   {
                        UserID = usr.UsrID,
                        RoleID = rls.RoleID
                    }).Distinct().ToList();

      List<string> outputRoleUserList =
      (
               from rls in roleUserList
               from mis in missingRoleUserList
               where (rls.RoleID + rls.UserID) != (mis.RoleID +mis.UserID)
               select rls.UserID + ",\"" + rls.RoleID
      ).DefaultIfEmpty().Distinct().ToList();

1 个答案:

答案 0 :(得分:3)

我不完全确定这是你正在寻找的,但我会试一试:

尝试将Linq中的where子句链接到SQL,您可能会得到更好的结果:

List<string> outputRoleUserList = 
           from rls in roleUserList
           from mis in missingRoleUserList
           where rls.RoleID != mis.RoleID
           where rls.UserID != mis.UserID
           select rls.UserID + ",\"" + rls.RoleID

这实际上会生成如下SQL:

rls.RoleId != mis.UserID AND rls.UserId != mis.UserID

但是,你已经强制执行了roleUserList和missingRoleUserList,所以你在第三个Linq语句中使用的不是Linq to SQL,而是Linq to Objects,如果我正确读取它。

我很想看到一些额外的信息或澄清,然后我会更好地理解发生了什么!

编辑:我意识到另一种可能性,object.UserID或object.RoleID可能抛出内部NullPointerException并失败,因为其中一个值返回null。您可以通过以下方式解决此问题:

List<string> outputRoleUserLIst2=roleUserList
    .Where(x => x != null && x.UserID != null && x.RoleID != null && missingRoleUserList
        .Where(y => y != null && y.UserID != null && y.RoleID != null && y.RoleID!=x.RoleID && y.UserID!=x.UserID)
        .FirstOrDefault()!=null)
    .Select(x => x.UserID + ",\"" + x.RoleID).Distinct().ToList();

这不太漂亮,这是其他Linq语法(我觉得更舒服)但希望你能理解我的目标。我很想知道如果你把它放到你的程序中会发生什么(如果我已经正确地猜到你的所有意义了!)。我会回顾一下你是否添加了任何信息!