ASP.Net Core 2.0 API OData без Entity Framework, но с хранимыми процедурами - PullRequest
0 голосов
/ 20 февраля 2019

Совершенно новый для ASP.Net Core, особенно с API.Раньше меня использовали для создания простых API-интерфейсов с использованием контроллера по умолчанию, например:

    [Produces("application/json")]
    [Route("api/TestCust")]
    public class TestCustController : Controller
    {
        // GET: api/TestCust
        [HttpGet]
        public IEnumerable<Customer> Get()
        {
            IEnumerable<Customer> customer = null;
            .... 
            return customer;
        }



  // GET: api/TestCust/5
        [HttpGet("{id}", Name = "Get")]
        public IEnumerable<Customer> Get(int id)
        {
            IEnumerable<Customer> customer = null;
            return customer;
        }

Теперь я сталкиваюсь с новой задачей, поскольку я создаю API, но клиентская сторона уже созданатретья вечеринка.Это означает, что я вынужден сделать это их способом.

К счастью, это хорошо задокументировано, и они предоставляют примеры запросов, которые они будут отправлять в мой API.Один из этих запросов следующий: /Customers?$filter=ID+eq+guid'1D225D75-A587-4AE4-BA9A-2224B2484EA5' и для того, чтобы привлечь всех клиентов: /Customers?$orderby=Code&$skip=100

Теперь я совершенно новичок в OData, я только что узнал о них вчера и следил занекоторые уроки об этом.Хотя большинство из них используют Entity Framework, а я использую Dapper в сочетании с хранимыми процедурами.

Далее следуют учебники: https://damienbod.com/2018/10/12/odata-with-asp-net-core/, https://dotnetthoughts.net/perform-crud-operations-using-odata-in-aspnet-core/

Итак, я пытался сделать запрос, используя [EnableQuery], но это пока не сработало.Я свяжу ошибку внизу.

Итак, что именно я сделал?Ну, я изменил Startup.cs

  public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddOData();
            services.AddODataQueryFilter()
            services.AddMvc();
            services.AddOptions();
        }

И внутри моего контроллера клиента:

 public class CustomersController : ODataController{   
    ...

[EnableQuery]
        public IEnumerable<Customer> Get()
        {
            IEnumerable<Customer> allCustomers = null;
            IEnumerable<Addresses> allAddresses = null;
            IEnumerable<Contacts> allContacts = null;

            //Execute the procedures to fetch our objects.
            using (var connection = new SqlConnection(config.Value.ConnectionString.ToString()))
            {
                allCustomers = connection.Query<Customer>("someproc");
                allAddresses = connection.Query<Addresses>("someproc");
                allContacts = connection.Query<Contacts>("someproc");
            }
            //Loop through our customer object
            foreach(var item in allCustomers)
            {
                //Initialize a collection of address + contact
                ICollection<Contacts> CustomerContact = null;
                ICollection<Addresses> CustomerAddress = null;

                //Bind the Contact and Address to the correct Customer using the CustomerID 
                //Tijdelijk uitgezet omdat customer nu even geen GUID is..

                //CustomerContact = allContacts.Where(x => x.Customer == item.Id).ToList();
                //CustomerAddress = allAddresses.Where(x => x.Customer == item.Id).ToList();
                item.Contacts = CustomerContact;
                item.Addresses = CustomerAddress;
            }
            return allCustomers;
}

И вот сообщение, которое он возвращаетв браузере / почтальоне как «ошибка 400 неверный запрос»:

Запрос, указанный в URI, недопустим.Не удается найти контейнер служб для маршрута без OData.Это может произойти при использовании компонентов OData на маршруте, отличном от OData, и обычно является проблемой конфигурации.Вызовите EnableDependencyInjection (), чтобы включить компоненты OData на не-OData маршрутах.Это может также произойти, когда запрос был ошибочно обработан слоем маршрутизации ASP.NET Core вместо слоя маршрутизации OData, например, URL-адрес не включает префикс маршрута OData, настроенный посредством вызова MapODataServiceRoute ()

Полное сообщение - https://pastebin.com/QtyuaQv1

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Если вам все еще нужен способ заставить OData работать с Dapper, я нашел полезную ссылку, которая может помочь с расшифровкой опций фильтра в raw sql, которую вы можете позже выполнить на уровне слоя БД: https://github.com/cuongle/DynamicOdata/blob/master/DynamicOdata.Service/SqlQueryBuilder.cs Вы можете использовать его как статический класс и просто взять часть, которая создает предложения WHERE и ORDERBY, и выполнить часть SELECT, сцепленную с ним в хранилище или откуда вы берете данные.

0 голосов
/ 20 февраля 2019

Здесь есть пара вещей. Во-первых, для работы с OData вам нужно возвращать IQueryable, а не IEnumerable.Кроме того, я не уверен, что Dapper работает с OData, поскольку OData - это технология MS, которая в первую очередь предназначена для работы с EF и «сущностями».Я думаю, что вы могли бы заставить его работать, но вам нужно будет собрать какое-то решение, которое принимает входные данные ODataQueryOptions и отображает их в IQueryable для EF-стороны.(В принципе, это не легко)

...