Как ограничить количество полей, возвращаемых из запроса Silverlight 4 RIA services

#silverlight-4.0 #entity-framework-4 #wcf-ria-services

#silverlight-4.0 #entity-framework-4 #wcf-ria-services

Вопрос:

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

 TableA:
  ID
  Field1
  Field2
  Field3

TableB:
  ID
  TableAID (foreign key)
  Field1
  RestrictedField2
  

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

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

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

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

Обновить

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

Комментарии:

1. Я также перепостил этот вопрос на форуме Silverlight и получил ответ, аналогичный моему ответу ниже: forums.silverlight.net/forums/p/227614/551503.aspx#551503

Ответ №1:

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

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

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

Ответ №2:

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

Комментарии:

1. Представление — это один из способов, но другим было бы просто создать класс ViewModel, который инкапсулирует данные, которые вы хотите вернуть.

2. @Nissan Fan: Это не решает мою проблему, поскольку ограниченная информация все равно будет передаваться через службу в ViewModel. Любой, у кого есть HTTP-сниффер (Fiddler), мог бы получить доступ к данным, посмотрев на это. Еще лучше, они могли бы просто создать свой собственный клиентский прокси и напрямую вызывать службу. Мне нужно предотвратить сценарии такого типа.

3. На самом деле ViewModel — это определенный вами конкретный класс, который содержит только ту информацию, которая вам нужна. Вы вернете их из метода Invoke или Get в RIA в результате вызова клиента Silverlight.

4. @Nissan Fan: А, понял, я думал, вы размещаете ViewModel на стороне клиента. То, что вы предлагаете, не сильно отличается от изменения «модели» (т. Е. Добавления представления), поэтому я бы счел, что это решение того же типа.

5. Будет достаточно либо View, либо ViewModel; подход ViewModel имеет дополнительное преимущество для вас, поскольку вам не нужно вносить изменения в базу данных ни сейчас, ни в будущем, если требования изменятся.