Массивный с веб-Api WCF для возврата динамических типов / расширений?

#.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:

http://geekswithblogs.net/michelotti/archive/2011/06/06/understanding-custom-wcf-web-api-media-type-processors-on-both.aspx

Я предполагаю, что он может использовать json.net или другая библиотека для сериализации динамических объектов

http://blogs.clariusconsulting.net/kzu/using-json-net-for-text-and-binary-json-payloads-with-wcf-webapi/

Веб-WCF

http://wcf.codeplex.com/wikipage?title=WCF HTTP

Ответ №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.
 

Я надеюсь, что это вам поможет. Дайте мне знать, если есть что-нибудь еще.