Как автоматически загрузить детали (с условиями), связанные с объектом, использующим Ria Services? - PullRequest
0 голосов
/ 06 октября 2011

Я занимаюсь разработкой проекта с использованием Silverlight 4 и Entity Framework 4 и пытаюсь автоматически загрузить детали (с условиями), связанные с сущностью, когда клиент загружает EntityQuery.

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

Например, вот как выглядят мои сущности:

Сущность Фильм

Id (int)

[Include]
MovieLocalizedInformations (EntityCollection<MovieLocalizedInformation>)

Сущность MovieLocalizedInformation

Id (int)
Movie_Id (int)
LanguageCode (eg.: en)
Title

На моем объекте DomainService я предоставляю следующий метод:

public IQueryable<Movie> GetMovies( string languageCode )
{
  return this.ObjectContext.Movies.Include( "MovieLocalizedInformations" );
}

Это прекрасно работает.Но когда я пытаюсь добавить условие where для фильтрации локализованной информации на основе кода языка, на клиент загружаются только фильмы.

Есть ли способ выполнить фильтрацию в одном запросе?

Примечание: я также использую DomainDataSource с пейджингом на клиенте, поэтому решение должно работать с этим.

Любая помощь будет принята с благодарностью!

Спасибо,

Жак.

Ответы [ 2 ]

0 голосов
/ 07 октября 2011

Хорошо,

По соображениям эффективности я решил использовать пользовательский объект 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 будут загружены вконтекст.

0 голосов
/ 06 октября 2011

Не уверен насчет Enitity Framework, но с помощью LinqToSqlDomainService вы используете LoadOith loadOption для включения сущностей сведений, а затем используете LoadOption AssociateWith для фильтрации деталей, например,

DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Movies>(i => i.MovieLocalizedInformations);
options.AssociateWith<Movies>(i => i.MovieLocalizedInformations.Where(d=> myListOfIds.Contains(d.LocationId)));
...