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

标签 c# linq list anonymous-types

我有这些在 SQL 中工作的大型数据集,效果很好。然而我很难转换到 linq - 我是 linq 的新手

从 table1 t1、table2 t2 中选择 *,其中 (t1.RoleId+t1.UserId)!=(t2.RoleId+t2.UserId)

顺便说一句,当两个变量分开时,我得到了不想要的结果。

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

在 C# 中,我有两个匿名列表。最后一个 linq 语句在出现 null 之前效果很好。什么都没有返回。我什至想过使用左连接但没有成功。

那么您将如何使用匿名类型列表处理上述查询?

到目前为止我拥有的 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();

最佳答案

我不完全确定这就是您正在寻找的东西,但我会尝试一下:

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

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 语法(我使用起来更舒服),但希望您能理解我在这里的目的。我很想知道如果您将其放入程序中会发生什么(如果我正确地猜出了您的所有含义!)。我稍后会查看您是否添加了任何信息!

关于C# SQL To Linq - 具有多个变量的Where 子句比较 (var1+var2) !=(var1+var2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7603541/

相关文章:

c# - EF LINQ 查询 if 子句中抛出空引用异常

hibernate - 通过排序而不是索引字段在 hibernate 中映射列表

c# - 比较两个列表的差异

c# - 将多个 sql 行与不同的列组合起来

c# - 删除或添加项目时 CollectionViewSource 绑定(bind)不更新

c# - 如何动态地将 OrderBy() 添加到 LINQ 查询

c# - 另一个 LINQ OrderBy 查询

python - 收到错误 : list assignment index out of range

java - 通用对象链表 (Java)

c# - C# 中字符串数组的反序列化