Проблемы с соединительным запросом Linq-to-SQL - PullRequest
1 голос
/ 04 июля 2011
var grid = new System.Web.UI.WebControls.GridView();
        grid.DataSource = from booking in bookings
                         join f in getallAttendees on booking.UserID equals f.UserID into fg
                         from fgi in fg.DefaultIfEmpty() //Where(f => f.EventID == booking.EventID)
                          where
                              booking.EventID == id

                          select new
                          {
                              EventID = booking.EventID,
                               UserID = booking.UserID,
                              TrackName = booking.Name,
                              BookingStatus = booking.StatusID,
                               AttendeeName = booking.FirstName,
                             // name = account.FirstName,
                              AmountPaid = booking.Cost,
                              AttendeeAddress = booking.DeliveryAdd1,
                              City = booking.DeliveryCity,
                               Postcode = booking.Postcode,
                              Date = booking.DateAdded,
                              product = fgi == null ? null : fgi.productPurchased
                         };

Booking дизайн стола:

ID, EventID, UserID, BookingStatus, AmountPaid, AttendeeAddress, City, Date

Product дизайн стола:

ID, EventID, SecondDriver, Apples, Bananas, SecondItem

Связь между бронированием и таблицей продуктов очень многая, а внешний ключ - UserID

Приведенный выше запрос Linq-to-SQL возвращает данные только тех пользователей, у которых booking.UserID equals att.UserID, и я хочу, чтобы все пользователи этого конкретного события также возвращали яблоки и банановые поля, если они купили, иначе заполнить ноль в этом столбцы.

Любые возможные решения или примеры будут высоко оценены.

1 Ответ

1 голос
/ 04 июля 2011

Я думаю, что вы ищете эквивалент для левого соединения.Вы можете сделать это, используя метод расширения DefaultIfEmpty().Измените оператор соединения и добавьте еще один from in, например, так:

join at in getallAttendees on booking.UserID equals at.UserID into attg
from att in attg

В своем операторе выбора вы можете использовать троичный оператор ? :, например, так:

SecondItem = att == null ? null : att.SecondItem,

Отредактируйте

Ваши bookings и getallAttendees IQueryable должны исходить из одного контекста, если вы хотите объединить их вместе.

В противном случае вам нужно будет использовать getallAttendees.ToList() иbookings.ToList()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...