Использование операций службы службы данных ADO.NET из клиента .NET - PullRequest
4 голосов
/ 13 октября 2009

Я пытаюсь создать службу данных 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 Ответ

5 голосов
/ 14 октября 2009

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

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

В настоящее время 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();
}
...