Масштабируемость. Безопасность. Наша компания использует 1 дБ на потребительский подход также. Это также делает код немного легче поддержать также.
Немного неуклюже, но будет работать:
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.
Вы, вероятно, ошиблись. Сначала я бы предположил, что Action
должен быть абстрактным классом, и вы вообще не должны иметь возможность создавать его экземпляры. Если вы затем извлекаете только подмножество свойств, а это подмножество больше не позволяет различать события и действия, вероятно, это неправильный способ пытаться создавать из них события и действия.
Так что на самом деле это не так. техническая проблема - должно быть довольно легко включить некоторую дискриминационную информацию в анонимный тип - но проблема дизайна. Я предлагаю переосмыслить, требуется ли различать результат запроса, и если да, то действительно ли отличать результат при отсутствии дискриминатора - хорошая идея.