Использование операций службы службы данных ADO.NET из клиента .NET

Я пытаюсь создать службу данных ADO.NET с большим количеством объектов и несколькими операциями службы. С одной стороны, я создал веб-приложение ASP.NET, в котором расположены модель данных сущности ADO.NET и служба данных ADO.NET. С другой стороны, я создал второе веб-приложение ASP.NET, которое имеет ссылку на службу данных.

Объекты проходят очень хорошо, я могу использовать LINQ для извлечения нужных мне данных:

TestEntities entities = new TestEntities(
            new Uri("http://localhost/service/service.svc"));

var query = from customer in entities.Customers
                    where customer.ID == 1234
                    select customer;

query.ToList();

Это работает. Тем не менее, получение информации с помощью Service Operations полностью ускользает от меня. Код службы данных:

public static void InitializeService(IDataServiceConfiguration config) {
    config.SetEntitySetAccessRule("*", EntitySetRights.All);
    config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
}

[WebInvoke]
public IQueryable<Customer> GetSomeCustomers() {
    TestEntities entities = new TestEntities();
    return from customer in entities.Customers
        where customer.ID > 0 && customer.ID < 20
        select customer;
}

Когда я добавил ссылку «Служба» в свой клиентский проект, Visual Studio не выполняла никаких операций «Служба». Я знаю, что могу получить к ним доступ через сконструированные URI и метод BeginExecute либо объекта DataServiceContext, либо объекта TestEntities (в данном случае), или чего-то подобного, но это не так, как я этого хочу.

Я хочу использовать LINQ для просмотра возвращенных данных Сервиса. Это возможно? Должно быть, верно?

1 ОТВЕТ
РЕШЕНИЕ

Простые вещи, когда вы знаете.

Просто несколько вещей, которые нужно знать:

В настоящее время DataServiceClientGenerator (который использует EntityClassGenerator) не создает методы для операций службы.

Использование метода CreateQuery в контексте не поддерживается для сервисных операций, в настоящее время они работают, потому что для этого на стороне клиента нет проверки (вы заметите, что если вы используете CreateQuery, то «()» добавляется в конец метода запроса например, « http: //localhost/service.svc/method ()? parameter = 2 », вы можете использовать CreateQuery, но это не рекомендуется.

Не все сервисные операции возвращают значения, но для этого примера я покажу только пример для тех, которые это делают.

public partial class NorthwindEntities
{ 
    public IQueryable<Order> OrdersByRegion(int regionId)
    {
     return this.Execute<Orders>(new Uri(string.Format("{0}OrdersByCountry?regionId={1}", this.BaseUri, regionId), UriKind.RelativeOrAbsolute));
    }
}

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

PS: В вашем примере вам не нужно создавать новый контекст данных в вашей сервисной операции (на стороне сервера), на которую DataService уже ссылается, когда вызывается сервис.

Вы можете переопределить создание контекста данных на стороне службы следующим образом:

protected override NorthwindEntities CreateDataSource()
{
     return new NorthwindEntities();
}
5
14.10.2009 19:24:43
Хорошо, но как вызвать операцию "OrdersByRegion" со стороны клиента? Вам нужно создать REST URL (например, server / service.svc / OrdersByRegion? RegionId = 1 ) вручную? Спасибо.
Ciprian Bortos 17.11.2009 15:11:02
Привет Ciprian, да, к сожалению, вы делаете. string.format обычно лучше всего использовать. посмотрите мой первый пример кода, который демонстрирует, как его назвать
dmportella 17.11.2009 22:48:16
Извините, я забыл пометить это как принятый ответ (я просматривал свои вопросы), в тот момент я был немного разочарован тем, что URL-адреса не будут создаваться автоматически. Спасибо.
pancake 30.07.2011 07:01:30