Linq to Entities Left Outer Join с различными типами - PullRequest
0 голосов
/ 11 мая 2011

Я, вероятно, уже потратил 40 часов на эту проблему, я попробовал все решения на этом сайте и в Google, и я до сих пор не могу сделать эту работу.

Мне нужно присоединить таблицу к результатам предыдущего запроса, хранящимся в переменной. Поле соединения - это varchar в таблице, запрашиваемый для результата в var, и 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, сумма (a.pointvalue) оценка от ( выберите userfbid, pointvalue от л осталось присоединиться к qa на qa.id = l.qaid оставляем соединение q на q.id = qa.qid оставьте соединение qz на qz.id = q.qzid где qa.pointvalue> 0 и qz.cid = 12 объединить всех выберите fbid userfbid, pointvalue из БН где дата> = '5/5/2011 04:00' и дата <= '16.05.2011 04:00' ) группа по a.userfbid ) b </p>

оставил соединение ( выберите a.userfbid, сумма (a.pointvalue) оценка от ( выберите userfbid, pointvalue от л осталось присоединиться к qa на qa.id = l.qaid оставляем соединение q на q.id = qa.qid оставьте соединение qz на qz.id = q.qzid где qa.pointvalue> 0 объединить всех выберите fbid userfbid, pointvalue из БН ) группа по a.userfbid ) c on.userfbid = b.userfbid

оставил соединение с s.userfbid = b.userfbid упорядочить по счету desc

Ответы [ 2 ]

0 голосов
/ 12 мая 2011

Вот вам простое левое внешнее соединение:

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 для того, что вы действительно хотите.

0 голосов
/ 12 мая 2011

Я предполагаю, что в вашей базе данных s.userFBID.First() никогда не равно нулю?

Если это так, то ваша проблема может быть в выражениях типа FirstOrDefault().Name - когда FirstOrDefault() оценивается как null, тогда, очевидно, вы получите исключение nullreference: /

Чтобы обойти это, попробуйте что-то вроде:

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();

Однако мне трудно это сделать, не видя структуру базы данных ... или некоторые примеры данных


Как только у вас что-то заработало ... тогда я настоятельно рекомендую вам разбить это на что-то более понятное - я действительно не уверен, что здесь происходит!

...