Вложенные LINQ IQueryable и WCF WebApi - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть такой метод, который работает, как и ожидалось.

[WebGet]
public IQueryable<BuildJobModel> GetCustomers()
{
    var context = new MyDataContext(); // ADO.NET Entity Data Model
    var query = from c in context.Customers
                select new CustomerModel {
                    Id = c.Id,
                    Name = c.Name
                };
    return query;
}

Но когда я пытаюсь создать более сложный запрос, как этот, он не работает.

[WebGet]
public IQueryable<BuildJobModel> GetCustomers()
{
    var context = new MyDataContext(); // ADO.NET Entity Data Model
    var query = from c in context.Customers
                select new CustomerModel {
                    CustomerId = c.CustomerId,
                    Name = c.Name,
                    Orders = from o in c.Orders
                             select new OrderModel {
                                 OrderId = o.OrderId,
                                 Details = o.Details
                             }
                };
    return query;
}

Модели выглядят так:

public class CustomerModel
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public IEnumerable<OrderModel> Orders { get; set; }
}

public class OrderModel
{
    public int OrderId { get; set; }
    public string Details { get; set; }
}

Исключение:

Невозможно сериализовать член Proj.CustomerModel.Logs типа System.Collections.Generic.IEnumerable`1 [[Proj.OrderModel,Proj, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = ноль]], потому что это интерфейс.

Мои цели:

  • Я хочубыть в состоянии предоставить интерфейс IQueryable.
  • Я хочу вернуть вложенные данные.
  • Я хочу использовать свои собственные модели, а не объекты ado.net
  • Я хочупоразить базу данных как можно меньшим количеством запросов (один будет лучшим).

Ответы [ 3 ]

0 голосов
/ 01 февраля 2012

В случае, если вы пытаетесь вернуть JSON: сборка в JsonFormatter не способна (де) сериализовать интерфейсы. Вам следует попробовать JSON.NET Formatter из WebApiContrib .

0 голосов
/ 02 февраля 2012

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

public class CustomerModel
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public OrderModel[] Orders { get; set; }
}

public class OrderModel
{
    public int OrderId { get; set; }
    public string Details { get; set; }
}

Если вы сериализуете это в json / xml, я подозреваю, что встроенные сериализаторы не знают, что делать с IEnumerable.

0 голосов
/ 01 февраля 2012

Я бы настоятельно рекомендовал , а не , указав IQueryable в качестве типа возврата службы WCF.

  • WCF был разработан для возврата данных, а не запросов
  • Вы теряете контроль над природой запроса: кто-то может потенциально использовать этот запрос ресурсоемким образом

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

Относительно вашего списка целей:

  1. Можете ли вы объяснить это? Я не вижу, что интерфейс IQueryable имеет отношение к вложенным данным.
  2. Вы по-прежнему можете возвращать массивы или списки ваших моделей
  3. Вы можете лучше контролировать производительность, если выполняете запрос локально и вместо этого возвращаете результаты

Обновление: Взгляните на Службы данных WCF - которые могут делать то, что вы хотите.

...