0

Я читал, что вы можете устанавливать бизнес-правила на сервере при работе с службами WCF RIA, но я не понимаю, как это сделать. В основном то, что у меня есть, есть строка, хранящаяся в зашифрованной базе данных. У меня есть представление, которое возвращает этот столбец, и я бы хотел, чтобы он был возвращен клиенту незашифрованным. У меня есть стандартный DomainService Получить методДолжен ли сервер выполнять пост-обработку в строке до того, как он будет возвращен через запрос WCF RIA?

public IQueryable<qry_ClientList> GetQry_ClientList(Guid Key) 
    { 
     return this.ObjectContext.qry_ClientList.OrderBy(p => p.ClientCode); 
    } 

Может кто-то мне точку в правильном направлении, как бы я вызвать функцию дешифрования на этом поле, прежде чем он вернулся? У меня есть причина, по которой я хочу сделать это в коде, а не на сервере, но я не понимаю этого.

+0

Действительно ли вы должны обрабатывать всю коллекцию? Из подписи метода (неиспользуемый параметр 'Guid key') кажется, что он должен возвращать только один объект' qry_ClientList' вместо 'IQueryable ' –

+0

@ JozefBenikovský Неиспользуемый параметр является ключом аутентификации. Эта система связана с очень старой пользовательской системой аутентификации, я достал код, связанный с этим для простоты, но забыл удалить параметр. – cost

ответ

0

Материализовать свои объекты в список первым, запустить функцию, а затем преобразовать список обратно в IQueryable перед возвращением:

public IQueryable<qry_ClientList> GetQry_ClientList(Guid Key) 
{ 
    List<qry_ClientList> clients = 
     this.ObjectContext.qry_ClientList.OrderBy(p => p.ClientCode).ToList(); 
    foreach (qry_ClientList c in clients) { 
     Decrypt(c); 
    } 
    return clients.AsQueryable; 
} 
0

Вы можете сделать постобработки с помощью переопределения метода DomainService.Query() следующим образом:

public override System.Collections.IEnumerable Query(QueryDescription queryDescription, out IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> validationErrors, out int totalCount) 
{ 
    IEnumerable result = base.Query(queryDescription, out validationErrors, out totalCount); 

    // now you have collection with all client query operators applied and 
    // you can apply post-processing 
    if (queryDescription.Method.Name == "GetQry_ClientList") 
    { 
     result.OfType<qry_ClientList>().ToList().ForEach(c => Descrypt(c)); 
    } 

    return result; 
}