Платформа объекта - Избранные определенные столбцы и возврат, со строгим контролем типов, не теряя бросок

Масштабируемость. Безопасность. Наша компания использует 1 дБ на потребительский подход также. Это также делает код немного легче поддержать также.

5
задан Community 23 May 2017 в 12:11
поделиться

2 ответа

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

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 имеет типа, не допускающего значения NULL, необходимо преобразовать его в тип, допускающий значение NULL, в запросе L2E.

5
ответ дан 14 December 2019 в 19:17
поделиться

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

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

0
ответ дан 14 December 2019 в 19:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: