Ответ 1
Это, по-видимому, ограничение в текущей версии Entity Framework (1.0). Посмотрите этот связанный вопрос SO.
В вашем случае, включая соответствующие свойства UserCreated и UserEdited в проекции, это правильное решение. Однако, если вы также хотите заполнить свойство Изображение объекта UserSpecial, вы также должны включить его:
var results = from articleSpecial in ctx.ArticleBase.OfType<ArticleSpecial>()
select new
{
articleSpecial,
articleSpecial.UserCreated,
((UserSpecial)articleSpecial.UserCreated).Image,
articleSpecial.UserEdited,
((UserSpecial)articleSpecial.UserEdited).Image
};
Конечно, этот запрос основывается на предположении, что все объекты ArticleSpecial всегда ссылаются на объект UserSpecial, иначе кастинг завершится неудачно.
Если это предположение не всегда верно, вы можете выразить тот же запрос, используя методы расширения LINQ и многострочную лямбда-функцию, чтобы выполнить безопасное литье:
var results = ctx.ArticleBase
.OfType<ArticleSpecial>()
.AsEnumerable()
.Select(a =>
{
var userCreated = a.UserCreated as UserSpecial;
if (userCreated != null)
{
var image = userCreated.Image;
}
var userEdited = a.UserEdited as UserSpecial;
if (userEdited != null)
{
var image = userEdited.Image;
}
return a;
});
В последнем примере вам также не нужно включать в результаты UserSpecial и Изображение. Вместо этого вам просто нужно получить доступ к свойствам навигации объектов ArticleSpecial во время фазы проектирования, чтобы заставить Entity Framework с нетерпением загружать связанные объекты.