#.net #c#-4.0 #dynamic #wcf-web-api #massive
#.net #c #-4.0 #динамический #wcf-web-api #массивный
Вопрос:
Я хочу использовать Massive для доступа к данным с помощью веб-api WCF и возвращать либо dynamic, либо ExpandoObject / IEnumerable<ExpandoObject> из моего веб-api.
У меня это в основном работает с использованием jsonnet MediaTypeFormatter, который использует Json.Сериализация NET ExpandoObject, но все возвращается в виде пар ключ-значение в Json, таких как:
[
{
"Key":"ID",
"Value":"1000"
},
{
"Key":"FirstName",
"Value":"John"
},
{
"Key":"LastName",
"Value":"Smith"
}
]
Но я хочу, чтобы:
[
{
"ID":"1000",
"FirstName":"John",
"LastName":"Smith",
}
]
Как если бы я использовал конкретный тип, например:
public class Customer
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Есть идеи о том, как отформатировать динамический / ExpandoObject как конкретный объект при возврате из веб-api WCF?
Комментарии:
1. Неважно, я заставил его работать, очистив существующую коллекцию форматеров. Я думал, что уже сделал это, но я установил точку останова, чтобы посмотреть, попадает ли она в мой jsonnet MediaTypeFormatter, а это не так. Попробовал еще раз, и теперь это работает.
2. Не могли бы вы опубликовать код, который вы используете?
3. да, то же самое, я тоже могу получить копию… я пытаюсь сделать это прямо сейчас
4. Просто сериализация WCF динамических типов DLR
Ответ №1:
Некоторые подробности о пользовательских форматерах типов носителей для веб-WCF:
Я предполагаю, что он может использовать json.net или другая библиотека для сериализации динамических объектов
Веб-WCF
Ответ №2:
Я думаю, вы принимаете запрос Expando и передаете в WCF. Просто попробуйте выполнить итерацию или просто добавьте ToList в свою коллекцию. Это преобразует ExpandoQuery в коллекцию объектов Expando. И если вы POCO для сопоставления, как клиент, как в вашем вопросе. Укажите выбор с вашими объектами POCO.
Например, если ваш запрос
Dynamic CustomerTable = DynamicObject("ConnectionString","TableName","PrimeryKey");
CustomerTable.All() //This will be ExpandoQuery
CustomerTable.All().Select(c=> new Customer () {FistName = c.FirstName, LastName = c.LastName}); // This will give collection of customer object. Just pass this as DTO to your WCF service.
Я надеюсь, что это вам поможет. Дайте мне знать, если есть что-нибудь еще.