Службы данных WCF + проекция LINQ в пользовательский тип - PullRequest
1 голос
/ 21 мая 2011

Я пытаюсь спроецировать части отображения и его список местоположений из службы данных WCF в пользовательский тип. Это возможно в службах данных WCF в клиенте Silverlight? Здесь есть некоторая помощь , но она не показывает получение списка назад, а также простых строк.

В настоящее время я получаю сообщение «NotSupportedException: создание или инициализация экземпляров типа UserQuery + Info с выражением d.Base.Title не поддерживается». Было бы бонусом, если бы вы могли рассказать мне, как выполнить Expand on Locations в этом синтаксисе (я знаю о Displays.Expand ("Locations")) или если мне это нужно.

Фрагмент LINQPad

var displays = from d in Displays.Where(d => d.Id == 3136)
select new Info
{
Name = d.Base.Title,

};


displays.Dump();

}
public class Info
{
private string name;
public string Name
{
  get
    {
      return this.name;
    }

    set
    {
      this.name = value;
    }
}
public IEnumerable<Location> locations;
public IEnumerable<Location> Locations
{
get{ return this.locations;}
set{ this.locations = value;}
}

Ответы [ 2 ]

1 голос
/ 21 мая 2011

Как уже отмечал svick, вы не можете запрашивать у сервера типы, которые он не понимает (по крайней мере, не используя OData, который есть).Но вы все равно можете запрашивать только те свойства, которые вам нужны, и ничего более.

Поскольку у меня нет вашего сервиса, в следующем примере используется демонстрационный сервис на odata.org:

    DemoService ctx = new DemoService(new Uri("http://services.odata.org/OData/OData.svc/"));

    var q =
        ctx.Products
            .Where(p => p.ID == 1)
            .Select(p =>
                new Product
                {
                    Category = new Category
                    {
                        Name = p.Category.Name
                    }
                });

    var r =
        q.AsEnumerable()
            .Select(p =>
                new
                {
                    CategoryName = p.Category.Name
                });

Первый запрос «q» будет полностью выполняться на сервере (за исключением создания объектов на стороне клиента), и он получит только имя категории (и метаданные обо всех рассматриваемых объектах).Он будет преобразован в URL, например /Products(1)?$expand=Category&$select=Category/Name.

Второй запрос начинается с AsEnumerable, который эффективно выполняет первый запрос, а затем просто выполняет простойпревратить в анонимный тип.Это делается полностью на клиенте (без взаимодействия с сервером).

1 голос
/ 21 мая 2011

Проблема в том, что вы фактически запрашиваете у своего сервера WCF тип, о котором он не знает. Поскольку он не может этого сделать, вы должны сделать это самостоятельно на своем компьютере:

Displays
  .Where(d => d.Id == 3136)
  .AsEnumerable()
  .Select(d => new Info { Name = d.Base.Title })

Это запустит Where() на сервере, но Select() на вашем компьютере.

...