Как ограничить поля, возвращаемые из запроса служб Silverlight 4 RIA

Я использую службы RIA с Silverlight 4 и хочу ограничить поля, возвращаемые службой. Например:

TableA:
  ID
  Field1
  Field2
  Field3

TableB:
  ID
  TableAID (foreign key)
  Field1
  RestrictedField2

В моем классе службы домена у меня есть что-то вроде этого, которое было сгенерировано при создании службы. Я добавил включения (которые работают нормально):

<RequiresAuthentication()>
Public Function GetTableA() As IQueryable(Of TableA)
    Return Me.ObjectContext.TableA.Include("TableB")
End Function

Мой вопрос: как мне получить все столбцы из TableA, а также получить Field1 из TableB, не возвращая RestrictedField2? Я почти уверен, что это сделано с помощью некоторой причуды Linq, но я не совсем уверен, как это сделать.

Спасибо! Мэтт

Обновить

Одно требование, которое я не перечислил выше. Столбец должен быть удален на стороне сервера, поскольку данные в RestrictedField1 не могут быть отправлены клиенту. Кроме того, мне нужно будет использовать это поле в другом методе службы домена (защищенном с помощью RequiresRoleAttribute), чтобы я мог предоставить информацию администратору. Это требование означает, что я не хочу создавать другой сложный тип и возвращать его. Я бы предпочел продолжить работу с типом модели EF.


person Matt Ruwe    schedule 28.04.2011    source источник
comment
Я также повторно разместил этот вопрос на форуме Silverlight и получил аналогичный ответ на свой ответ ниже: forum.silverlight.net/forums/p/227614/551503.aspx#551503   -  person Matt Ruwe    schedule 02.05.2011


Ответы (2)


Проверьте эту ссылку, я думаю, что это может решить вашу проблему без необходимости модели просмотра

http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/ab7b251a-ded0-487e-97a9-

Кажется, вы можете вернуть анонимный тип, а затем преобразовать его в нужный тип.

person Adetokunbo Hakeem Ayoade    schedule 09.06.2011

Основываясь на некоторой информации, которую я нашел, лучший способ выполнить то, что мне нужно, - это создать представление в базе данных и предоставить нужные мне данные через EF и RIA Services. Это, по-видимому, лучшее доступное решение.

person Matt Ruwe    schedule 01.05.2011
comment
Представление - это один из способов, другой - просто создать класс ViewModel, который инкапсулирует данные, которые вы хотите вернуть. - person Keith Adler; 01.05.2011
comment
@Nissan Fan: Это не решает мою проблему, поскольку информация с ограниченным доступом все равно будет передаваться через службу ViewModel. Любой, у кого есть HTTP-сниффер (Fiddler), может получить данные, посмотрев на них. Еще лучше, они могли просто создать свой собственный клиентский прокси и напрямую вызывать службу. Мне нужно предотвратить такие сценарии. - person Matt Ruwe; 02.05.2011
comment
Фактически, ViewModel - это конкретный класс, который вы определяете, который содержит только ту информацию, которая вам нужна / нужна. Вы вернете это из метода Invoke или Get в RIA в результате вызова от клиента Silverlight. - person Keith Adler; 02.05.2011
comment
@Nissan Fan: Ага, я думал, вы размещаете ViewModel на стороне клиента. То, что вы предлагаете, не сильно отличается от изменения модели (то есть добавления представления), поэтому я считаю, что это решение того же типа. - person Matt Ruwe; 02.05.2011
comment
Достаточно либо View, либо ViewModel; Подход ViewModel имеет дополнительное преимущество: вам не придется вносить изменения в базу данных сейчас или в будущем, если требования изменятся. - person Keith Adler; 02.05.2011