Можно ли манипулировать НЕКОТОРЫМИ сущностями в ServiceOperation, возвращая IQueryable - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть ServiceOperation для запроса элементов, доступных определенному пользователю в определенное время.Короче говоря, этот метод:

var fullResult = from i in Items where ... select i; //get ALL possible items where..., 

Допустим, он возвращает элементы {A, B, C, D}.Второй запрос отфильтровывает, к какому из этих элементов имеет доступ вызывающий пользователь.

var clientResult = from ci in fullResult where (privilege's and schedule's are true)

Этот результат преобразования в {A, C} и возвращается.Результат на стороне клиента: отображается только список элементов, к которым клиент имеет доступ.Это может раздражать, так как вы не знаете, допустили ли вы ошибку при поиске, или элемент просто сейчас недоступен.

Я хотел бы показать все возможные результаты клиенту {A, B, C, D}, но FLAG B и D в этом случае недоступны.

MyУ сущности уже есть свойство isReadOnly, которое я мог бы использовать.

Могу ли я написать запрос, чтобы не только отфильтровать, но и пометить оставшиеся результаты только для чтения?Идеальным результатом будет {A, B.isREadOnly = true, C, D.isReadOnly = true}

Или я достиг предела того, что выполнимо, и мне нужно написать традиционный веб-метод WCF,создать отдельный класс, возвращая список результатов?

PS: это свойство 'isReadOnly' используется только для этого, я не против, чтобы оно вообще изменялось в БД

Thanxдля любых указателей

Андреас

1 Ответ

1 голос
/ 16 декабря 2011

На вашем месте я бы не стал возвращать сущность непосредственно из вашего сервиса, а вместо этого сопоставил бы ее с чем-либо, имеющим свойство ReadOnly. Например, если ваша сущность:

public class A
{
    public string Name { get; set; }
}

Тогда у вас может быть контракт на передачу данных, подобный этому:

[DataContract]
public class AExtra
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public bool IsReadOnly { get; set; }
}

это означает, что вы можете сделать это в своем запросе:

var res = from a 
          in Items 
          where (...whatever your original logic is) 
          select new AExtra
            {
                Name = a.Name,
                IsReadOnly = (...put your logic for determining ReadOnly in here)
            };

А затем верните res из вашей сервисной операции.

На самом деле просто мнение, но мне нравится делать подобные вещи, а не отправлять сущности прямо из сервиса - это всегда дает мне немного больше свободы, чтобы изменить вещи, не выполняя слишком много эффектов.

...