Объедините две таблицы и отфильтруйте результат с помощью сервисов EF 4 и RIA - PullRequest
0 голосов
/ 31 января 2012
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

Итак, я пытаюсь отфильтровать по SiteId из таблицы Sites, ANDALSO по SiteUpdateDate в таблице SiteData, это последняя часть, в которой я не могу получить правильный синтаксис - просто говорится, что атрибут SiteUpdateDate не является членом ObjectContext.Site, который является правильной его частью SiteData

Как мне отфильтровать атрибуты во включенной таблице SiteData? Или как я могу переписать это и при этом вернуть Iquerable of Site с дочерней таблицей SiteData, отфильтрованной так, как я хочу? Должно быть действительно легко, но я борюсь, начинаю полагать, что включать отфильтрованную дочернюю коллекцию выбранного родителя не разрешено ...: (

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Я не очень хорошо разбираюсь в 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), поэтому вам нужно использовать проекцию анонимного типа, а затем проецировать запрос обратно на то, что вы хотите.

1 голос
/ 02 февраля 2012

Я не верю, что вы можете сделать это таким образом. Сначала вы должны вернуть своего родителя с дочерними коллекциями.

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, чтобы убедиться, что ваша Детская коллекция имеет [include] в качестве атрибута.

...