【问题标题】:C# SQL To Linq - Where Clause with multiple variables Comparison (var1+var2) !=(var1+var2)C# SQL To Linq - 具有多个变量的 Where 子句比较 (var1+var2) !=(var1+var2)
【发布时间】:2011-09-29 21:22:16
【问题描述】:

我有这些在 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();

【问题讨论】:

  • 我想请求一些额外的信息。我想我明白你在找什么,但你能确认或澄清一下吗?在我看来,您想要资源列表中没有“丢失”的所有内容的UserId,"RoleId,是这样吗?

标签: c# linq list anonymous-types


【解决方案1】:

我不完全确定这就是你要找的东西,但我会试一试:

尝试将 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 语法(我更习惯使用它),但希望你能理解我在这里的目的。我很想知道如果你把它放到你的程序中会发生什么(如果我猜对了你的所有意思!)。我稍后再回头看看您是否添加了任何信息!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-21
    • 2011-04-02
    • 2015-06-17
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多