WCF Json Data Return - PullRequest
       1

WCF Json Data Return

4 голосов
/ 22 июня 2011

Вот мои проблемы и требования.

// Ниже приведен мой список одной функции класса, то есть пользователя, у меня есть еще 10-15 функций класса

  public IEnumerable<Entity.User> User()
   {
        OpenStoredPorcedure("spDB");

        DataSet d = ExecuteDataSet();

        DataTable myDataTable = d.Tables[0];

        var stList = new List<Entity.User>();

        foreach (DataRow dr in myDataTable.Rows)
        {
            Entity.User usr = new Entity.User()
            {

                FirstName = dr["first_name"].ToString() ?? null,
                LastName = dr["last_name"].ToString() ?? null
            };

            stList.Add(usr);
        }

        return stList.AsEnumerable();
}

СейчасВ WCF я хочу одну функцию, как показано ниже *

 public IEnumerable fetchData(int id)
{         
   IEnumerable result1 = null;

    switch (id)

    {
        case 1:
            IEnumerable<Entity.User> result = User().AsEnumerable<Entity.User>().ToArray();
            result1 = result;
            break;
        case 2:
            IEnumerable<Entity.Project> result = User().AsEnumerable<Entity.Project>().ToArray();
            result1 = result;
            break;
    }

    return result1;
}

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

Ошибка запроса Сервер обнаружил ошибку при обработке запроса.Сообщение об исключении: «Невозможно сериализовать параметр типа« System.Collections.Generic.List`1 [Entity + User] »(для операции« fetchData », контракт« ISyncService »), поскольку это не точный тип« System.Collections ».IEnumerable 'в сигнатуре метода и отсутствует в коллекции известных типов.Чтобы сериализовать параметр, добавьте тип в коллекцию известных типов для операции, используя

Теперь я хочу, чтобы в WCF мы вызывали эту функцию и передавали идентификатор, это приведет к выводу списка json этогоКласс сущности.

Я получаю данные Json, когда использую функцию ниже

public List<Entity.User> fetchData()
{
        return User().ToList();    
}

Ответы [ 2 ]

1 голос
/ 22 июня 2011

В случае, если у вас есть базовый класс и наследование между возвращаемыми вами типами, вы должны добавить атрибут KnownType к вашему базовому классу datacontract, а затем указать все производные типы в атрибуте

Что-то вроде этого

[KnownType(typeof(YourDerivedType))]

Вот некоторая помощь: http://blogs.msdn.com/b/sowmy/archive/2006/06/06/all-about-knowntypes.aspx

В случае, если вы возвращаете типы, не связанные друг с другом, вы должны сделать что-то, как предложено OsQu.

0 голосов
/ 22 июня 2011

Я думаю, проблема в том, что вам нужно дать тип IEnumerable.

Если вы знаете тип в каждой таблице, вы можете создать универсальный метод и предоставить ему правильный тип.

public IEnumerable<T> fetchData<T>(int id)
{         
   IEnumerable<T> result1 = null;

    switch (id)
    {
        case 1:
            IEnumerable<T> result = sync.User() as IEnumerable<T>;
            result1 = result;
            break;
    }

    return result1;
}

А затем используйте его:

IEnumerable<Entity.User> retVal = fetchData<Entity.User>(1);

Подробнее о дженериках: Обобщения C #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...