У меня есть служба WCF. Он использует Linq-to-objects для выбора из словаря. Тип объекта прост:
public class User
{
public Guid Id;
public String Name;
}
Существует коллекция из Dictionary<Guid,User>
.
Я хочу использовать метод WCF OperationContract
, подобный этому:
public IEnumerable<Guid> GetAllUsers()
{
var selection = from user in list.Values
select user.Id;
return selection;
}
Он хорошо компилируется, но когда я запускаю его, я получаю:
Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: «Невозможно сериализовать параметр типа» System.Linq.Enumerable + WhereSelectEnumerableIterator 2[Cheeso.Samples.Webservices._2010.Jan.User,System.Guid]' (for operation 'GetAllUsers', contract 'IJsonService') because it is not the exact type 'System.Collections.Generic.IEnumerable
1 [System.Guid] 'в сигнатуре метода и отсутствует в коллекции известных типов. Чтобы сериализовать параметр, добавьте тип в коллекцию известных типов для операции, используя ServiceKnownTypeAttribute. '. Подробнее смотрите в журналах сервера.
Как я могу заставить выбор быть IEnumerable<Guid>
?
EDIT
Если я изменю код, чтобы сделать это, он работает хорошо - хорошая совместимость.
public List<Guid> GetAllUsers()
{
var selection = from user in list.Values
select user.Id;
return new List<Guid>(selection);
}
Есть ли способ для меня избежать создания / создания List<T>
?