Metoda do ASP.NET

0

Witam ma następujący problem muszę zrobić api za pomocą ASP.NET(Rest) posiadam juz gotowe pytania w sql, sever to Ms sql 2008
Oto przykładowe pytanie :
Select tw_Symbol From vwTowar Where tw_Symbol LIKE 'V%
Następnie przetłumaczyłem pytania za pomocą Linqer z sql na linq i uzyskałem to :


where
  VwTowar.Tw_Symbol.StartsWith("V")
select new {
  VwTowar.Tw_Symbol
} ``` 
i tutaj zaczyna dla mnie  problem jak napisać metodę aby obsługiwało to pytanie postępowałem zgodnie postępowałem zgodnie z tym poradnikiem [Link](https://www.youtube.com/watch?v=7zzIKStODT0) ale nie jest pokazane jak wykonywać pytanie . Próbowałem na rożne sposoby zrobić to ale nie potrafię dlatego zwracam się z pomocą aby ktoś pokazał jakiś przykład albo napisał przykładową metodę aby zadawało to pytanie .
1
  1. To Twoje to raczej nie jest REST.
    2, Masz jakieś podstawy w asp.net api? Masz tu jakiś kod? Nie bardzo wiem z jakiego poziomu zaczynać skoro potrzebujesz jakiegoś Linquer (cokolwiek to jest).
    Który rok studiów, albo która klasa średniej szkoły czy gimnazjum (z czystej ciekawości się pytam)?
0

Właśnie nie posiadam doświadczenia w rest ani w C# raczej w Java na Androida . Muszę utworzyć Api do aplikacji do ios i dlatego wybrałem rest po podpowiedziach na forach .
Przykładowa klasa utworzona zgodnie z wyżej wymionenego poradnika :

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;
using VerdentApi;

namespace VerdentApi.Controllers
{
    public class vwMagazynsController : ApiController
    {
        private VERDENT_SPZOOEntities1 db = new VERDENT_SPZOOEntities1();

        // GET: api/vwMagazyns
        public IQueryable<vwMagazyn> GetvwMagazyns()
        {
            return db.vwMagazyns;
        }

        // GET: api/vwMagazyns/5
        [ResponseType(typeof(vwMagazyn))]
        public IHttpActionResult GetvwMagazyn(int id)
        {
            vwMagazyn vwMagazyn = db.vwMagazyns.Find(id);
            if (vwMagazyn == null)
            {
                return NotFound();
            }

            return Ok(vwMagazyn);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private bool vwMagazynExists(int id)
        {
            return db.vwMagazyns.Count(e => e.dok_Id == id) > 0;
        }
    }
}

A Linqer korzystałem po to by tłumaczyć pytania z SQL na Linq

0

Wygląda jakbyś to miał zrobione z użyciem Entity Framework lub czegoś w tym stylu, zatem prawdopodobnie zadziałałoby coś takiego:

public IEnumerable<string> GetSymbolsStartingWithV()
{
    var result = from VwTowar in db.VwTowar where VwTowar.Tw_Symbol.StartsWith("V") select new { VwTowar.Tw_Symbol };
    return result;
}
0

Prawie działa poprawiłem pytanie trochęale za to jest błąd w zwrotem result
Obecny fragment kodu :

   public IEnumerable<string> GetSymbolsStartingWithV()
        {
            var result = from VwTowar in db.vwTowars where VwTowar.tw_Symbol.StartsWith("V") select new { VwTowar.tw_Symbol };
            return result;
        }

błąd :
Error CS0266 Cannot implicitly convert type 'System.Linq.IQueryable<<anonymous type:="type:" string="string" tw_symbol="tw_Symbol">>' to 'System.Collections.Generic.IEnumerable<string>'. An explicit conversion exists (are you missing a cast?)

0

Zawsze zastrzegam, ze nie jestem specem od webowych aplikacji. Trochę na wyrost napisałem, że to nie REST. To może być REST z jedną metodę GET ale REST (chyb?a) zakłada operowanie na obiektach (zasobach).

Co do ostatniego błędu to takie zapytanie zwraca IQuerable. Dodaj na końcu (zapytanie.......).ToList() i wtedy będziesz miał IEnumerable czyli to co jest oczekiwane.

Albo tak w składni dla normalnych ludzi. ToList() powoduje materializację czyli fizyczne wyciągnięcie danych z bazy i skopiowanie do listy.

public IEnumerable<string> GetSymbolsStartingWithV()
{
    return db.vwTowars.Where(x => x.tw_Symbol.StartWith("V")).Select(x => x.tw_Symbol).ToList();
}
0

Błędy są dwa, z rozpędu.

  1. Rzeczywiście zrób ToList(), bo zapytanie zwraca IQueryable;
  2. Twoje zapytanie robi: select new { VwTowar.tw_Symbol }; czyli zwraca obiekty pewnego anonimowego typu, zapytanie u jacek.placek robi: Select(x => x.tw_Symbol) i zwraca dokładnie stringi. Lepsze to drugie, bo nie trzeba się pałętać z anonimowymi typami przy definicji co metoda będzie zwracać.

W ogóle też IMO forma "nie-sqlowa" (bez słów kluczowych) jest czytelniejsza.

0

Dobrze ale mam jeszcze jeden problem bo metoda przyjęła się bez błędu ale mam jedno pytanie jak ją wywołać bo przykładowo metoda która sama się wygenerowała

     // GET: api/vwTowars
        public IQueryable<vwTowar> GetvwTowars()
        {
            return db.vwTowars;
        }
        public IEnumerable<string> GetSymbolsStartingWithV()
        {
            return db.vwTowars.Where(x => x.tw_Symbol.StartsWith("V")).Select(x => x.tw_Symbol).ToList();
        }

wystarczy wpisać w przeglądarce adres http://localhost:50398/api/vwTowars a tą co muszę zrobić aby wywołać ?

  public IEnumerable<string> GetSymbolsStartingWithV()
        {
            return db.vwTowars.Where(x => x.tw_Symbol.StartsWith("V")).Select(x => x.tw_Symbol).ToList();
        }
0

Dodaj sobie nad tą metodą GetCośtamCośtam atrybut [Route("api/getCokolwiekTutajChcesz")] i będzie dostępna pod adresem /api/getCokolwiekTutajChcesz.

0

Dziękuję za pomoc bardzo mi pomogliście ;) Mam jeszcze jedno pytanko macie jakieś poradniki / książki do polecenia do linq bo muszę jeszcze kilka pytań przetłumaczyć z join
Np :

SELECT  tw_Symbol, SUM(ob_IloscMag ) as ob_IloscMag
FROM vwZstWydWgKhnt LEFT JOIN tw__Towar ON ob_TowId = tw_Id 
LEFT JOIN sl_GrupaTw ON tw_IdGrupa = grt_Id 
WHERE dok_Status <> 2  
AND (( (dok_DataWyst>='20170101') AND (dok_DataWyst<='20171231') ) 
AND (dok_MagId IN (1 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 ))) 
AND tw_Symbol LIKE  'C500.%'  
AND tw_Symbol LIKE '_____104%' 
AND tw_Symbol LIKE '_________001%' 
AND tw_Symbol LIKE '_____________140%' 
AND tw_Symbol LIKE '_________________023%' GROUP BY tw_Symbol ORDER BY tw_Symbol

Chyba ze ktoś chce mi pomóc przetłumaczyć około 5 pytań :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0