如何使用Ria Services自动加载与实体关联的详细信息(包括条件)?

时间:2011-10-06 13:49:54

标签: silverlight-4.0 ria

我正在使用Silverlight 4和Entity Framework 4开发一个项目,我正在尝试在客户端加载EntityQuery时自动加载与实体关联的详细信息(包括条件)。

到目前为止,我已经能够使用 Include 属性来实现解决方案,该属性返回所有与主实体关联的详细信息。我在这里缺少的是能够根据某些标准过滤掉细节。

作为一个例子,这是我的实体的样子:

实体电影

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 :(得分:0)

不确定Enitity Framework,但使用LinqToSqlDomainService,您使用LoadWith loadOption 包含详细信息实体,然后使用AssociateWith LoadOption过滤细节,例如

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

答案 1 :(得分:0)

确定,

出于效率原因,我决定使用自定义DTO对象来获取本地化信息并将结果展平。

但是,当我的自定义DTO需要引用另一个自定义本地化DTO时,会出现同样的问题。

以下是我与ObjectSet提供的.Include(“PropertyName”)相同的做法:

实体 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; }
}

实体 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 of LocalizedMovieCollection ,另一个返回 IQueryable of 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 将被加载到上下文中。