Entity Framework - Выберите конкретные столбцы и возвращайте строго типизированный, не теряя приведения - PullRequest
5 голосов
/ 29 октября 2009

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

Структура моей Entity Framework имеет базовую сущность с именем Action . Отсюда я создал две унаследованные сущности с именами Event и Activity . Я хочу вернуть последние X-действия и передать их моему строго типизированному представлению, которое принимает действие и оттуда определяет, является ли оно действием или событием, и отображает правильное частичное представление.

if(Model.GetType() == typeof(Event))
{
  //render Event view
}
else if(Model.GetType() == typeof(Activity))
{
  //render Activity view
}

Я могу взять последние 10 как анонимный тип и затем разыграть:

var result = from a in new DataContext().Actions
             where a.UserId == someGuidValue
             select new { a.CreatedOn, a.Summary };

List<Action> list = result.AsEnumerable()
                          .Select(o => new Action {
                                           CreatedOn = o.CreatedOn, 
                                           Summary = o.Summary
                          }).ToList();

Однако, как только я передаю новый Список действий в мое строго типизированное представление, он теряет область действия, будь то Активность или Событие, так как он был разыгран как Действие. У меня вопрос, не раскрывая столбец дискриминатора, есть ли способ привести каждый элемент к нужному типу или я поступаю неправильно?

Ответы [ 2 ]

5 голосов
/ 29 октября 2009

Немного клудги, но работать будет:

var result = from a in new DataContext().Actions
             where a.UserId == someGuidValue
             let IsEvent = a as Event != null
             select new { a.CreatedOn, IsEvent, a.Summary };

List<Action> list = result.AsEnumerable()
                          .Select(o => o.IsEvent ?
                                           (Action) new Event {
                                               CreatedOn = o.CreatedOn, 
                                               Summary = o.Summary
                                           }
                                           : (Action) new Activity {
                                               CreatedOn = o.CreatedOn, 
                                               Summary = o.Summary
                                           }
                          }).ToList();

Пример со специфическими для типа столбцами, при условии, что e.EventSpecific имеет тип NULL.

var result = from a in new DataContext().Actions
             where a.UserId == someGuidValue
             let ev = a as Event
             let IsEvent = ev != null
             select new { a.CreatedOn, IsEvent, a.Summary, ev.EventSpecific };

List<Action> list = result.AsEnumerable()
                          .Select(o => o.IsEvent ?
                                           (Action) new Event {
                                               CreatedOn = o.CreatedOn, 
                                               Summary = o.Summary,
                                               EventSpecific = o.EventSpecific
                                           }
                                           : (Action) new Activity {
                                               CreatedOn = o.CreatedOn, 
                                               Summary = o.Summary,
                                               EventSpecific = o.EventSpecific // will be null, but using o.EventSpecific saves casting
                                           }
                          }).ToList();

Если o.EventSpecific имеет ненулевой тип, вы должны преобразовать его в обнуляемый тип в запросе L2E.

0 голосов
/ 29 октября 2009

Вы, вероятно, на неправильном пути. Сначала я бы предположил, что Action должен быть абстрактным классом, и вы вообще не сможете создавать его экземпляры. Если вы затем выбираете только подмножество свойств, а подмножество больше не позволяет различать события и действия, вероятно, это неправильный способ попытаться сделать из них события и действия.

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

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