Запрос связанных таблиц в службах данных WCF и привязка данных - PullRequest
0 голосов
/ 22 января 2011

Я хочу запросить службу данных WCF и использовать полученную информацию, чтобы связать ее с DataGridView. Все примеры, которые я видел ( как этот официальный ), предполагают самый простой сценарий, который всегда выбирает все столбцы одного объекта. Однако в большинстве случаев мне нужна информация от связанных сущностей, и я не хочу, чтобы каждое поле запрашиваемой сущности было:

  Int32 iIDFilter = 3;
  TestEntities oTestDB = new TestEntities(new Uri("http://desk01:9877/TestEntities/"));
  var oConsulta1 = from a in oTestDB.TBLTable1s
                    where a.IDField1 == iIDFilter
                    select new
                    {
                      IDField1 = a.IDField1,
                      IDField2 = a.TBLTable2.IDField1,
                      IDField3 = a.IDField3,
                      IDField4 = a.TBLTable3.IDField1,
                      IDField5 = a.IDRSGroup,
                      IDField6 = a.TBLTable4.IDField1
                    };
  DataServiceCollection<TBLTable1> eventos = new DataServiceCollection<TBLTable1>(oConsulta1);

В приведенном выше коде я получу сообщение об ошибке, поскольку не могу создать DataServiceCollection, поскольку я выбрал некоторые поля TBLTable1, а также некоторые поля некоторых связанных объектов. Есть ли способ обойти это? Всегда ли мне нужно выбирать все поля сущности без связанных полей при использовании служб данных WCF? Могу ли я хотя бы сделать foreach на результат?
Tks

1 Ответ

0 голосов
/ 25 января 2011

Ограничение состоит в том, что запрос должен возвращать «сущности». Самый простой способ получить это - вернуть экземпляры классов, которые представляют сущности, которые вы пытаетесь получить. Затем вы можете установить в него только те свойства, которые вам нужны. Вы также не можете «сгладить» результаты, поэтому, если вы хотите просто подмножество свойств связанной сущности, вам нужно спроецировать эту сущность, но только некоторые свойства на нее. Например (я добавил ссылку на демонстрационный сервис OData.org):

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

var query = from p in ctx.Products
            select new Product()
            {
                ID = p.ID,
                Name = p.Name,
                Category = new Category()
                {
                    ID = p.Category.ID,
                    Name = p.Category.Name
                }
            };

DataServiceCollection<Product> products = new DataServiceCollection<Product>(query);

foreach (var p in products)
{
    Console.WriteLine(p.Category.Name);
}

Это запустит этот URL:

http://services.odata.org/OData/OData.svc/Products()?$expand=Category&$select=ID,Name,Category/ID,Category/Name
...