我有这些在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();
答案 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语法(我觉得更舒服)但希望你能理解我的目标。我很想知道如果你把它放到你的程序中会发生什么(如果我已经正确地猜到你的所有意义了!)。我会回顾一下你是否添加了任何信息!