我正在使用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 和分页,因此解决方案需要使用它。
非常感谢任何帮助!
谢谢,
雅克。
答案 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 将被加载到上下文中。