使用EF 4和RIA服务加入两个表并过滤结果

时间:2012-01-31 13:00:06

标签: entity-framework silverlight-4.0 wcf-ria-services ria

Public Function LoadSiteInfo(ByVal sId As Integer) As IQueryable(Of Site)
    Return Me.ObjectContext.Sites.Include("SiteData").Where((Function(f) f.SiteID = sId) AndAlso Function(x) x.SiteData.SiteUpdateDate < today)) 
End Function

所以,我试图在Site表中过滤SiteId上的SiteId,在SiteData表中的SiteUpdateDate上过滤ANDALSO,这是我无法正确获取语法的最后一部分 - 它只是说SiteUpdateDate属性不是ObjectContext.Site,它是SiteData

的一部分

如何过滤所包含的表SiteData中的属性?或者我如何重写这个并仍然返回一个Iquerable of Site与SiteData childtable beeing过滤我想要的?应该真的很容易,但我很挣扎,开始相信包含一个选定父级的过滤子集合是不允许的...... :(

2 个答案:

答案 0 :(得分:1)

我不相信你可以这样做。您必须先使用子集合返回您的父级。

Public Function LoadSiteInfo(ByVal sId As Integer) As IQueryable(Of Site)
     return FillSiteInfo(sId).Where(Function(x) x.SiteData.SiteUpdateDate < today))
End Function 

Public Function FillSiteInfo(byVal sId as Integer) as IQueryable(of Site)
    Return Me.ObjectContext.Sites.Include("SiteData").Where((Function(f) f.SiteID = sId).AsQueryable()
End Function

那对你有用。

您还需要检查您的RIA服务,以确保您的Child Collection已将[include]作为属性。

答案 1 :(得分:1)

我对VB不好,所以这是C#版本。

return this.ObjectContext
   .Sites
   .Where(x => x.SiteData.All(y => y.SiteUpdateData < today))
   .Where(x => x.SiteId == sId)
   .Select(x => new { Sites = x, SiteDatas = x.SiteData })
   .Select(x => x.Sites);

诀窍是,你不能过滤一个渴望加载的属性(SiteData),所以你必须使用匿名类型投影,然后将查询投影回你想要的。