none
WEB API RRS feed

  • Soru

  • Merhaba, ben bir WEB API projes gelistiriyorum, sorum su sekilde:

            public HttpResponseMessage GetActiveDraws(string uname, string pwd, int ticketid)
            {
                using (WEBAPIEntities db = new WEBAPIEntities())
                {
                    List<TBL_DRAWS> result2 = null;
                    var result = (from i in db.TBL_USERS
                                  where i.User_Name == uname && i.User_Pwd == pwd
                                  select i.User_Name).FirstOrDefault();
                    if (result != null)
                    {
                        result2 = db.TBL_DRAWS.Where(e => e.Ticket_Id == ticketid).ToList();

                        if (result2.Count > 0)
                        {
                            return Request.CreateResponse(HttpStatusCode.OK, result2);
                        }
                        else
                        {
                            return Request.CreateErrorResponse(HttpStatusCode.NotFound, ticketid.ToString() + " Not Found ");
                        }
                    }
                    else
                    {
                        return Request.CreateErrorResponse(HttpStatusCode.NotFound, uname + " tapilmadi");
                    }
                }
            }

    Bu metod bana asagidaki gibi (json ) istediim sonucu veriyor.

    [{"Row_Id":1,"Ticket_Id":1,"Draw_Date":"2014-06-09T00:00:00","Draw_Status":true,"Ticket_Cost":0.2},{"Row_Id":3,"Ticket_Id":1,"Draw_Date":"2015-09-12T00:00:00","Draw_Status":true,"Ticket_Cost":0.25]

    Benim yapmak istedigim TBL_DRAWS tablosunun tumunu degil, istedigim alanlari json olarak cekmek.
    List<TBL_DRAWS>-i List<string> ile degistirdigimde sonuc string olarak 1 satirda cikiyor, bu sekilde:

    ["{ Ticket_Id = 1, Draw_Number = 1043, Draw_Status = True }","{ Ticket_Id = 1, Draw_Number = 1045, Draw_Status = True }"]

    Bunu nasil cozerim? Tesekkurler.

    12 Aralık 2017 Salı 13:05

Yanıtlar

  • Yanlışın var. JsonIgnore fonksiyonlardan gizlemez sadece serialize edilmemesini sağlar. Sadece belli metodlarda serialize edilmemesini istiyorsan anonim tiplerden (ilk yöntem) farklı bir seçeneğin kalmıyor. 

    fonksiyonun başındaki result2 yi değiştirmeyi unutmuşum. result2 ya dynamic ya da object tipi olmalı. Veya result2 yi silip (gereksiz zaten) doğrudan query sonucunu atabilirsin. Hatta iki sorguyu birleştirebilirsin gibi. Böylece iki kere sorgu göndermek yerine tek sorguda işini halledebilirsin. Bu durumda kodların 

    public HttpResponseMessage GetActiveDraws(string uname, string pwd, int ticketid)
            {
                using (WEBAPIEntities db = new WEBAPIEntities())
                {
                    var result = (from draw in db.TBL_DRAWS 
                                  let user = (from u in db.TBL_USERS
                                  where u.User_Name == uname && u.User_Pwd == pwd
                                  select u.User_Name).FirstOrDefault()
                                     where user != null && draw.Ticket_Id == ticketid 
                                     select new
                                     {
                                         i.Ticket_Id,
                                         i.Draw_Number,
                                         i.Draw_Status
                                     }).ToList();
    
                        if (result != null && result.Count > 0)
                        {
                             return Request.CreateResponse(HttpStatusCode.OK, result);
                        }
                        else
                        {
                            return Request.CreateErrorResponse(HttpStatusCode.NotFound, ticketid.ToString() + " Not Found ");
                        }
                }
            }
    şeklinde istediğin sonucu veriyor olması lazım. 

    Not: Aldığın hata foreach içinde listeye ekleme yaparken ToString() ile string e çevirip öyle eklemeye çalışıyor olmandan kaynaklanıyor. string TBL_Draws a çevrilemiyor. ToString i silsen bile anonim tip olacağı için yine çeviremiyecek ve yine hata alacaksın. Çünkü artık nesnen TBL_DRAWS nesnesini değil select new ile oluşturduğun anonim bir tipi kullanıyorsun. İlla ki liste kullanacaksan listeninde ya object ya da dynamic tip olması lazım.

    Not 2: Sorguyu denemedim ama çalışır diye tahmin ediyorum. Eğer hata alırsan hata mesajını yaz tekrar bakarız.


    • Düzenleyen Olcay GUZEL 13 Aralık 2017 Çarşamba 06:27
    • Yanıt Olarak İşaretleyen Lwin88 13 Aralık 2017 Çarşamba 06:54
    13 Aralık 2017 Çarşamba 06:18

Tüm Yanıtlar

  • db.TBL_DRAWS.Where(e => e.Ticket_Id == ticketid).Select(t=> new {
      TicketID = t.TicketId, DrawNumber = t.DrawNumber, DrawStatus = t.DrawStatus
    }).ToList();

    şeklinde değiştirerek kullanmalısın. Yani yeni tip oluşturmalısın. 

    Diğer bir yöntem modelde Serialize olmasını istemediğin alanları JsonIgnore gibi attributelerle işaretlemelisin

    12 Aralık 2017 Salı 14:40
  • JsonIgnore tablonun Ignore olunan alanini hicbir metotta gostermiyor. Benim istedigim bir metotta o alani gosterirken, diger bir metotta gostermemek. 
    13 Aralık 2017 Çarşamba 05:15
  •         public HttpResponseMessage GetActiveDraws(string uname, string pwd, int ticketid)
            {
                using (WEBAPIEntities db = new WEBAPIEntities())
                {
                    List<TBL_DRAWS> result2 = new List<TBL_DRAWS>();

                    var result = (from i in db.TBL_USERS
                                  where i.User_Name == uname && i.User_Pwd == pwd
                                  select i.User_Name).FirstOrDefault();
                    if (result != null)
                    {
                        var query = (from i in db.TBL_DRAWS
                                     where i.Ticket_Id == ticketid
                                     select new
                                     {
                                         i.Ticket_Id,
                                         i.Draw_Number,
                                         i.Draw_Status
                                     }).ToList();

                        if (query.Count > 0)
                        {
                            foreach (var item in query)
                            {
                                result2.Add(item.ToString());
                            }
                            return Request.CreateResponse(HttpStatusCode.OK, result2);
                        }
                        else
                        {
                            return Request.CreateErrorResponse(HttpStatusCode.NotFound, ticketid.ToString() + " Not Found ");
                        }
                    }
                    else
                    {
                        return Request.CreateErrorResponse(HttpStatusCode.NotFound, uname + " Not Found ");
                    }
                }
            }

    Bu sekilde yazdigimda aldigim hata:

    Severity Code Description Project File Line Suppression State
    Error CS1503 Argument 1: cannot convert from 'string' to 'WebAPI.Models.TBL_DRAWS'


    • Düzenleyen Lwin88 13 Aralık 2017 Çarşamba 05:35 no
    13 Aralık 2017 Çarşamba 05:32
  • Yanlışın var. JsonIgnore fonksiyonlardan gizlemez sadece serialize edilmemesini sağlar. Sadece belli metodlarda serialize edilmemesini istiyorsan anonim tiplerden (ilk yöntem) farklı bir seçeneğin kalmıyor. 

    fonksiyonun başındaki result2 yi değiştirmeyi unutmuşum. result2 ya dynamic ya da object tipi olmalı. Veya result2 yi silip (gereksiz zaten) doğrudan query sonucunu atabilirsin. Hatta iki sorguyu birleştirebilirsin gibi. Böylece iki kere sorgu göndermek yerine tek sorguda işini halledebilirsin. Bu durumda kodların 

    public HttpResponseMessage GetActiveDraws(string uname, string pwd, int ticketid)
            {
                using (WEBAPIEntities db = new WEBAPIEntities())
                {
                    var result = (from draw in db.TBL_DRAWS 
                                  let user = (from u in db.TBL_USERS
                                  where u.User_Name == uname && u.User_Pwd == pwd
                                  select u.User_Name).FirstOrDefault()
                                     where user != null && draw.Ticket_Id == ticketid 
                                     select new
                                     {
                                         i.Ticket_Id,
                                         i.Draw_Number,
                                         i.Draw_Status
                                     }).ToList();
    
                        if (result != null && result.Count > 0)
                        {
                             return Request.CreateResponse(HttpStatusCode.OK, result);
                        }
                        else
                        {
                            return Request.CreateErrorResponse(HttpStatusCode.NotFound, ticketid.ToString() + " Not Found ");
                        }
                }
            }
    şeklinde istediğin sonucu veriyor olması lazım. 

    Not: Aldığın hata foreach içinde listeye ekleme yaparken ToString() ile string e çevirip öyle eklemeye çalışıyor olmandan kaynaklanıyor. string TBL_Draws a çevrilemiyor. ToString i silsen bile anonim tip olacağı için yine çeviremiyecek ve yine hata alacaksın. Çünkü artık nesnen TBL_DRAWS nesnesini değil select new ile oluşturduğun anonim bir tipi kullanıyorsun. İlla ki liste kullanacaksan listeninde ya object ya da dynamic tip olması lazım.

    Not 2: Sorguyu denemedim ama çalışır diye tahmin ediyorum. Eğer hata alırsan hata mesajını yaz tekrar bakarız.


    • Düzenleyen Olcay GUZEL 13 Aralık 2017 Çarşamba 06:27
    • Yanıt Olarak İşaretleyen Lwin88 13 Aralık 2017 Çarşamba 06:54
    13 Aralık 2017 Çarşamba 06:18
  • Cok tesekkur ederim cevaplariniz icin, tam istedigim sekilde oldu.
    13 Aralık 2017 Çarşamba 06:54