Linq to Entities Left Outer以不同类型加入

时间:2011-05-11 19:57:22

标签: c# linq join types entities

到目前为止,我可能已经花费了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排序

2 个答案:

答案 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。