Левое соединение в Entity Framework с несколькими операциями соединения - PullRequest
0 голосов
/ 04 мая 2020

Я работаю с сущностями LINQ и не нашел для этого хорошего решения. У меня есть большой запрос, который дает мне записи в соответствии с этим, и вот запрос, и этот запрос не дает мне ожидаемого результата при соединении с таблицей SMSLog, потому что некоторые из коротких ссылок являются нулевыми на стороне обратного вызова, поэтому я должен сделать его внешним но проще ли изменить весь запрос или в любом случае добиться внешнего соединения в данной конкретной ситуации

var callback = Context.Callbacks.Where(_ => _.Status == 1)
                .Join(Context.Users,
                    c => c.UserId,
                    u => u.Id,
                    (c, u) => new
                    {
                        User = new
                        {
                            u.SalesRepId,
                            UserName = u.FirstName + " " + u.LastName,
                            u.Email,
                            u.PhoneNumber,
                        },
                        Callback = new
                        {
                            c.TaskId,
                            c.DateCallback,
                            c.DeviceId,
                            c.DateEnd,
                            c.callbackId,
                            c.Point,
                            c.DeviceType,
                            c.Code,
                            c.ShortLinkCode
                        }
                    })
                .AsEnumerable()
                .Join(Context.SMSLog,
                    c => c.Callback.ShortLinkCode,
                    sms => sms.ShortLinkCode,
                    (c, sms) => new
                    {
                        c.Callback,
                        c.User,
                        SMS = new
                        {
                            sms.TelNo
                        }
                    })
                .AsEnumerable()
                .Concat(query)
                .Join(Context.Items,
                    c => c.Callback.TaskId,
                    i => i.Id,
                    (c, i) => new
                    {
                        c.Callback,
                        c.User,
                        c.SMS,
                        Item = new
                        {
                            i.en_US,
                            i.ru_RU,
                            i.tr_TR,
                        },
                    })
                .AsEnumerable();

Я пробовал этот запрос для их объединения, но у меня это не сработало

var query = (from cb in Context.Callbacks
                         join usr in Context.Users on cb.UserId equals user.Id
                         join sms in Context.SMSLog on cb.ShortLinkCode equals sms.ShortLinkCode into gj
                         where cb.Status == 1
                         from subcallback in gj.DefaultIfEmpty()
                         select new
                         {
                             Callback = new
                             {
                                 cb.TaskId,
                                 cb.DateCallback,
                                 cb.DeviceId,
                                 cb.DateEnd,
                                 cb.callbackId,
                                 cb.Point,
                                 cb.DeviceType,
                                 cb.Code,
                                 cb.ShortLinkCode
                             },
                             User = new
                             {
                                 usr.SalesRepId,
                                 UserName = usr.FirstName + " " + usr.LastName,
                                 usr.Email,
                                 usr.PhoneNumber,
                             },
                             SMS = new
                             {
                                 subcallback.TelNo
                             }
                         }).AsEnumerable();
...