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: string 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

Ef ma też obsługę Raw SQL queries więc nie musisz nic tłumaczyć jeśli NAPRAWDĘ nie chcesz.
np.

var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList();

Jak masz daty w zapytaniach to trzeba je (być może) odpowiednio sformatować.
jak chcesz coś działać w c# to polecam solidną naukę linq bo to naprawdę fajna biblioteka(?, język?).

0

A co dokładnie chcesz? Np. takie coś

var cars = db.Cars.SqlQuery("select * from cars").ToList();

zwraca listę samohcodów z tabeli cars
To samo z takim zapytaniem
var cars = db.Database.SqlQuery<Car>("select * from cars").ToList();

jak sdefiniujesz jakis inny model wynikowy
np:

public class CarModel {
        public String N { get;set;}
        public String R { get; set; }

    }

TO możesz z tej samej tabeli zapytać tak

var cars = db.Database.SqlQuery<CarModel>("select Nazwa as N, Rejestracja as R from cars").ToList();

Czyli nazywasz jawnie kolumny w zapytanie SQL (Nazwa as N) i masz mieć takie pola w klasie modelu.
Jeśli u Ciebie jest

SELECT tw_Symbol, SUM(ob_IloscMag ) as ob_IloscMag

to w klasie modelu masz mies pola: tw_Symbol i ob_IloscMag (albo je ponazywaj po ludzku) czyli
public class MagazynInfo
{
public string tw_Symbol {get;set;)
public int ob_IloscMag {get;set;} // jeśli to jest int
}

twoje całe zapytanie powinno przejść pod warunkiem, ze samo w sobie jest poprawne (i formaty dat się zgadzają)

0

kurcze już tyle poradników przeczytałem ze już nie wiem co jest dobrze a co źle potrzebuje dokładnie przykładową metodę np : do takiego pytania SELECT * FROM vwTowar
od początku do końca. Tutaj do czego na razie doszedłem fajerwerków nie ma i pewnie tak źle

  public ActionResult Towar() // tutaj nw czy dobrze
        {
            var data2 = db.vwTowars.SqlQuery("SELECT * FROM vwTowar").ToList(); // Chyba jedyne co dobrze jest  :/ 
            return View(data2);//tutaj  raczej źle zraca
        }
0
Paweł Ada napisał(a):
        var data2 = db.vwTowars.SqlQuery("SELECT * FROM vwTowar").ToList(); // Chyba jedyne co dobrze jest  :/ 

to raczej dałbym do jakiegoś service'a z którego mógłbyś zwrócić jakiś Viewmodel

0

Zdefiniuj sobie klasę modelu dla danych z vwTowars bo może widok tego nie rozumie.

0

Zdefiniuj sobie klasę modelu dla danych z vwTowars bo może widok tego nie rozumie.

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