none
Linq и LEFT OUTER JOIN к двум таблицам на правой стороне RRS feed

  • Общие обсуждения

  • Всем привет! Попробую объяснить проблему постепенно, чтобы понятно было.

    Есть 2 таблицы:

    History: ID, userID, Date

    ExistingUsers: userID, UserName, FullName

    Нужно отобрать запси с таким набором полей:
    History.Date, ExistingUsers.UserName, ExistingUsers.FullName

    Делаем так:
    _history = From h In db.History
                     Join u In db.ExistingUsers
                     On h.userID Equals u.userID
                     Select h.Date, u.UserName, u.FullName

    Получаем INNER JOIN, соответственно, если в ExistingUsers не будет найден соответствующий пользователь (например, удален), то запись не получим вообще.

    Значит нужен LEFT OUTER JOIN:

    _history = From h In db.History
                     From u In db.ExistingUsers.Where(Function(a) a.userID = h.userID).DefaultIfEmpty
                     Select h.Date, u.UserName, u.FullName

    Теперь History получим в любом случае, даже если пользователя в таблице ExistingUsers уже не существует. Поля u.UserName, u.FullName просто будут пустыми.


    Пока все хорошо, но все же хочется видеть в History информацию и об удаленных пользователях - они будут перемещаться в таблицу RemovedUsers (она очень похожа на ExistingUsers, теже поля):

    History: ID, userID, Date

    ExistingUsers: userID, UserName, FullName
    RemovedUsers:  userID, UserName, FullName

    Как теперь изменить запрос LEFT OUTER JOIN, чтобы ExistingUsers и RemovedUsers по сути объединялись в одну таблицу в запросе?




    14 июля 2014 г. 15:38

Все ответы

  • Использовать Union а лучше сделать View в которой будет этот юнион на бд, а еще лучше не выносить пользователе в отдельную таблицу. А какую цель приследуете вынося удаленных пользователей в другую таблицу?
    14 июля 2014 г. 16:25
  • Выношу удаленных пользователей в другую таблицу триггером.

    MVC 5 Identity, не смотря на то, что у учетной записи в таблице присутствует ID, не даст создать нового пользователя с существующим UserName. Это странно будет выглядеть для админа, который не сможет создать пользователя, видя, что у него такого логина как бы и нет ))

    Насчет вьюшки, вроде в MVC Code First нельзя к ней обратиться в запросе?

    Union пробовал:

    _histoty = From h In db.History
                    From u In db.Users.Union(db.RemovedUsers).Where(Function(a) a.userID = h.userID).DefaultIfEmpty
                    Select h.Date, u.UserName, u.FullName

    Не удалось привести тип объекта "System.Data.Entity.Core.Objects.ObjectQuery`1[MyApp.RemovedUser]" к типу "System.Collections.Generic.IEnumerable`1[MyApp.ApplicationUser]".


    14 июля 2014 г. 17:52