Выполнение двух левых соединений за одним столом одним вызовом - PullRequest
3 голосов
/ 29 марта 2012

У меня есть следующие таблицы:

Пользователи:

  • userId, userFirstName, userLastName.

holdBilling:

  • bEntityID, CarrierOID, PayerOID, holdTYPE, createUserID.

Носитель:

  • carrierOID, carrierName.

плательщик:

  • payerOID, payerName.

Я хочу сохранить код в новом объекте

holdBilling => new
{
      FirstName, LastName, CarrierName, PayerName
}

Одна из этих сущностей имеет либо плательщика, либо стоимость перевозчика (не может иметь обе). В основном я хочу сделать 2 левых соединения на одном столе одним вызовом. Это будет SQL-запрос, который будет работать для меня.

SELECT TOP 1000 [ID]
      ,[bEntityID]
      ,c.carrierID
      ,c.carrierName
      ,p.payerID
      ,p.payerName
      ,[holdType] ( this is "C" for carrier and "P" for payer ) 
  FROM .[dbo].[holdBilling] hb
  left join dbo.payer p on hb.payerID = p.payerID
  left join dbo.carrier c on hb.carrierID = c.carrierID
  where [bEntityID] = 378

Временное решение, которое я нашел, это получить список всех перевозчиков

 var listC = (from hold in holdBilling
              join u in Users on hold.createUserID equals u.userID
              join c in carrier.DefaultIfEmpty() on hold.carrierID equals c.carrierID
                             select new
                             {
                                 Elem = hold,
                                 FName = u.userFirstName,
                                 LName = u.userLastName,
                                 Carrier = c.carrierName,
                                 Payer = ""
                             }).ToList();

и один для всех плательщиков

 select new
        {
            Elem = hold,
            FName = u.userFirstName,
            LName = u.userLastName,
            Carrier = "",
            Payer = p.payerName
        }).ToList();

и объединяя их, я уверен, что должно быть решение для выполнения обоих в одном запросе.

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Примерно так:

var listC = (
                from hb in holdBilling
                from p in payer.Where(a=>a.payerID==hb.payerID).DefaultIfEmpty()
                from c in carrier.Where(a=>a.carrierID=hb.carrierID).DefaultIfEmpty()
                where hb.bEntityID==378
                select new
                {
                    hb.bEntityID,
                    c.carrierID,
                    c.carrierName,
                    p.payerID,
                    p.payerName,
                    holdType=(payer==null?"P":"C")
                }
                ).Take(1000)
                .ToList();
1 голос
/ 29 марта 2012

Вам нужно использовать DefaultIfEmpty , чтобы выполнить левое соединение

 var listC = (from hold in holdBilling
              from u in Users.Where(x => hold.createUserID == x.userID).DefaultIfEmpty()
              from c in carrier.Where(x => hold.carrierID == x.carrierID).DefaultIfEmpty()
              select new
              {
                Elem = hold,
                FName = u.userFirstName,
                LName = u.userLastName,
                Carrier = c.carrierName,
                Payer = ""
              }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...