到目前为止,我可能已经花费了40个小时来处理这个问题,我已经在这个网站和谷歌上尝试了所有解决方案,但我仍然无法完成这项工作。
我需要将表连接到上一个查询的结果,存储在var中。连接字段是查询var中结果的表中的varchar,以及要连接的表中的bigint(long)。这是当前的尝试,它告诉我“对象引用未设置为对象的实例”。所有实体的错误看起来都像是胡说八道,对我而言,我认为它试图告诉我没有任何匹配,但谁知道。
List<reportUser> ru = leaders
.GroupJoin(db.sweeps,
a => a.FBID.ToString(),
s => s.userFBID.First().ToString(),
(a, matching) => new reportUser
{
FBID = a.FBID,
CurrentPoints = a.CurrentPoints,
Name = matching.FirstOrDefault().Name,
Email = matching.FirstOrDefault().email
}
?? new reportUser
{
FBID = 0,
CurrentPoints = 0,
Name = "",
Email = ""
})
.Select(a => a)
.ToList();
这是下面要求的SQL。我已经包含了SQL来构建Leaders对象,以上所有内容实际上是代表最后一行,它只是一个左连接。
选择s.name,s.email,b.score,c.score整体 来自( 选择a.userfbid,sum(a.pointvalue)得分 来自( 选择userfbid,pointvalue 来自l 在qa.id = l.qaid上加入qa 在q.id = qa.qid上左连接q 在qz.id = q.qzid上左加qz 其中qa.pointvalue&gt; 0和qz.cid = 12 联合所有 选择fbid userfbid,pointvalue 来自bn 其中日期&gt; ='5/9/2011 04:00'和 date&lt; ='5/16/2011 04:00' ) 一个 由a.userfbid分组 )b
左连接( 选择a.userfbid,sum(a.pointvalue)得分 来自( 选择userfbid,pointvalue 来自l 在qa.id = l.qaid上加入qa 在q.id = qa.qid上左连接q 在qz.id = q.qzid上左加qz 其中qa.pointvalue&gt; 0 联合所有 选择fbid userfbid,pointvalue 来自bn ) 一个 由a.userfbid分组 )c on c.userfbid = b.userfbid
在s.userfbid = b.userfbid上左连接 按得分desc排序
答案 0 :(得分:0)
我假设你的数据库中s.userFBID.First()
永远不会为空?
如果这是正确的,那么您的问题可能在FirstOrDefault().Name
类型语句中 - 当FirstOrDefault()
评估为null
时,显然您会得到nullreferenceexception:/
要解决这个问题,请尝试以下方法:
List<reportUser> ru = leaders
.GroupJoin(db.sweeps,
a => a.FBID.ToString(),
s => s.userFBID.First().ToString(),
(a, matching) =>
{
var match = matching.FirstOrDefault();
return match != null ?
new reportUser
{
FBID = a.FBID,
CurrentPoints = a.CurrentPoints,
Name = match.Name,
Email = match.email
}
: new reportUser
{
FBID = 0, // a.FBID ?
CurrentPoints = 0, // a.CurrentPoints ?
Name = "",
Email = ""
}})
.Select(a => a)
.ToList();
但是,如果没有看到数据库的结构......或者一些样本数据,我发现这样做有点困难
一旦你有了工作......那么我强烈建议你尝试将其分解成更容易理解的东西 - 我真的不确定这里发生了什么!
答案 1 :(得分:0)
这是一个简单的左外连接:
var query = from l leaders
join s in db.sweeps on l.FBID equals s.userFBID.First() into joined
from j in joined.FirstOrDefault()
select new reportUser
{
FBID = l.FBID,
CurrentPoints = l.CurrentPoints,
Name = j == null ? string.Empty : j.Name,
Email = j == null ? string.Empty : j.email
}
如果这不是你想要的......也许尝试发布你真正想要的SQL。