Хорошо,
По соображениям эффективности я решил использовать пользовательский объект DTO, который извлекает локализованную информацию и сглаживает результат.
Но та же проблема возникла, когда требовался мой пользовательский DTOдля ссылки на другой пользовательский локализованный DTO.
Вот как я пришел сделать то же самое, что .Include ("PropertyName"), который предлагает ObjectSet:
Entity LocalizedMovieCollection
public class LocalizedMovieCollection
{
[Key]
public int Id { get; set; }
public string Name { get; set; } (the result of a sub query based on the language)
[Include]
[Association( "LocalizedMovieCollection_LocalizedMovies", "Id", "MovieCollection_Id" )]
public IEnumerable<LocalizedMovie> Movies { get; set; }
}
Entity LocalizedMovie
public class LocalizedMovie
{
[Key]
public int Id { get; set; }
public string Name { get; set; } (the result of a sub query based on the language)
public int MovieCollection_Id { get; set; }
[Include]
[Association( "LocalizedMovie_LocalizedMovieCollection", "MovieCollection_Id", "Id", IsForeignKey = true]
public LocalizedMovieCollection MovieCollection { get; set; }
}
Затем я объявил два метода: один, который возвращает IQueryable LocalizedMovieCollection идругие, IQueryable LocalizedMovie .(Примечание: должен быть хотя бы один метод, который возвращает каждый тип сущности, чтобы сущность автоматически генерировалась на клиенте Silverlight)
Моя цель - автоматически загрузить коллекцию MovieCollection, связанную с фильмом, чтобы методопределение для получения фильмов следующее:
public IQueryable<LocalizedMovie> GetMovies( string languageCode )
{
return from movie in this.ObjectContext.Movies
join movieLocalizedInfo in this.ObjectContext.MovieLocalizedInformations
on movie equals movieLocalizedInfo.Movie
join movieCollection in this.ObjectContext.MovieCollections
on movie.MovieCollection equals movieCollection
join movieCollectionLocalizedInfo in this.ObjectContext.MovieCollectionLocalizedInformations
on movieCollection equals movieCollectionLocalizedInfo.MovieCollection
where movieLocalizedInfo.LanguageCode == languageCode && movieCollectionLocalizedInfo.LanguageCode == languageCode
select new LocalizedMovie()
{
Id = movie.Id,
Name = movieLocalizedInfo.Name
MovieCollection_Id = movieCollection.Id,
MovieCollection = new LocalizedMovieCollection(){ Id = movieCollection.Id, Name = movieCollectionLocalizedInfo.Name }
}
}
Когда клиент Silverlight загружает запрос, все LocalizedMovies и связанные с ними LocalizedMovieCollections будут загружены вконтекст.