我有这些在 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/