Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

linQ ve foreach hakkında fikir danışma!

Konu, 'ASP.NET MVC' kısmında her_mes tarafından paylaşıldı.

  1. her_mes

    her_mes Aktif Üye

    Kayıt:
    8 Nisan 2007
    Mesajlar:
    355
    Beğenilen Mesajlar:
    0
    Şehir:
    Girne-KKTC
    Merhaba arkadaşlar,

    Başlıktan da anlaşılacağı gibi MVC'de deneyimli birilerinin yazdığım kod ile ilgili fikrini söylemesini istiyorum. Yazdığım kod çalışıyor ama mantığıma uymayan bir şey varmış gibi hissediyorum

    Üç adet tablomuz var, Bu tabloları entity framework ile prejeye aldım. Detaylarına çok fazla girmeden,

    1. CATEGORIES
    2. SUBCATEGORIES
    3. DETAILS

    Bu üç tabloyu LinQ ile CAT_ID==CAT_ID gibi ilişkilendiremedim ve foreach ile yaptım. Bu şekilde yapınca benim istemediğim veriler de Views içine taşınmış olmuyor mu? Hani tüm tablo içeriği taşınıyor da foreach ile istediklerimi alıyormuşum gibi hissettirdi?

    Controllers
    Kod:
        public class TestController : Controller
        {
            webSiteDB my_Db = new webSiteDB();
    
    
            public ActionResult Index()
            {
                var Categories = (from cat in my_Db.CATEGORIES where cat.CAT_STATU == 1 orderby cat.CAT_ORDER ascending, cat.CAT_TITLE ascending select cat);
                var CatList = Categories.ToList();
    
    
                var SubCategories = (from scat in my_Db.SUBCATEGORIES where scat.SUBCAT_STATU == 1 orderby scat.SUBCAT_ORDER ascending, scat.SUBCAT_TITLE ascending select scat);
                ViewBag.SubCatList = SubCategories.ToList();
    
    
                var Details = (from list in my_Db.DETAILS where list.DETAIL_STATU == 1 orderby list.DETAIL_ORDER ascending, list.DETAIL_TITLE ascending select list);
                ViewBag.DetailList = Details.ToList();
    
    
                return View(CatList);
            }
    
    
            protected override void Dispose(bool disposing)
            {
                my_Db.Dispose();
                my_Db = null;
                base.Dispose(disposing);
            }
        }
    


    View
    Kod:
    @using System.Collections.Generic;
    @model IEnumerable<webSite.Models.CATEGORIES>
    
    
    @{
        ViewBag.Title = "Index";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
    
    <h2>Index</h2>
    
    
    <ul style="text-align: left;">
        @foreach (var item in Model)
        {
            <li>@Html.DisplayFor(modelItem => item.CAT_TITLE)</li>
                <ul>
                    @foreach (var scItem in (ViewBag.SubCatList as IEnumerable<webSite.Models.SUBCATEGORIES>).Where(a => a.CAT_ID == item.CAT_ID))
                    {
                        <li>@scItem.SUBCAT_TITLE
                            <ul>
                                @foreach (var scItem2 in (ViewBag.DetailList as IEnumerable<webSite.Models.DETAILS>).Where(a => a.SUBCAT_ID == scItem.SUBCAT_ID))
                                {
                                    <li>@scItem2.LINK_TITLE</li>
                                }
                            </ul>
                        </li>
                    }
                </ul>
            </li>
        }
    </ul>
    
     
  2. writeLine

    writeLine Daimi Üye

    Kayıt:
    11 Şubat 2005
    Mesajlar:
    1,189
    Beğenilen Mesajlar:
    0
    Şehir:
    Bursa
    doğru düşünüyorsun. bunun için genelde dto(data transfer object) mantığı kullanılır. yani hemen hemen her iş için farklı class modeller oluşturup viewlere onu geçebilirsin böylelikle gereksiz veriler geçmemiş ve sql sorgularında tablonun bütün alanlarını çekmemiş olursun.

    select cat yerine mesela select new KategoriModel {...}
    select scat yerine mesela select new AltKategoriModel {...}
    select list yerine mesela select new ListeModel {...}

    gibi kullanabilirsin.
     
  3. her_mes

    her_mes Aktif Üye

    Kayıt:
    8 Nisan 2007
    Mesajlar:
    355
    Beğenilen Mesajlar:
    0
    Şehir:
    Girne-KKTC
    merhaba @writeLine,

    Öncelikle yorumun için teşekkürler,

    Aslında benim tam sıkıntım şuydu, 50 kayıt içinde foreach ile dönmem gerekirken bir anda 300 kayıt içinde foreach ile dönüyordum. Ben de Modeli view içine taşımak yerine, cs tarafında bir metod yazdıp view tarafında metodu kullandım.

    Başlarda MVC biraz kafamı karıştırdı ama yavaş yavaş aradığım çözümleri buluyorum.
     
  4. renegade

    renegade Daimi Üye

    Kayıt:
    28 Nisan 2007
    Mesajlar:
    671
    Beğenilen Mesajlar:
    0
    Meslek:
    Developer
    Şehir:
    Her Yerden
    Doğru düşünüyorsun, fazladan data çekiyorsun, MVC dünyası kullanmama rağmen hala garip geliyor bana. Bir yerden güzel tertemiz bir html çıktısı olustururken webformda bununan esnekliği tamamen kaybediyoruz 2-3 katı kod yazmamıza rağmen istediğimiz sonuçları bazen alamıyoruz. Poco model viewmodeller havalarda ucusyor birbirne aktarmalar falan ortalık savas alanına geliyor. Bir de foeach ıcınde bir list verım text alanlardan gelen datayı controller uzerınde alamamak benı çileden çıkartmaya yetiyor. For ile bir yere kadar oluyor ama orda da bambaşka sıkıntılar olusuyor. MVC garip bir dünya :)

    --- Ekleme ---

    Doğru düşünüyorsun, fazladan data çekiyorsun, MVC dünyası kullanmama rağmen hala garip geliyor bana. Bir yerden güzel tertemiz bir html çıktısı olustururken webformda bununan esnekliği tamamen kaybediyoruz 2-3 katı kod yazmamıza rağmen istediğimiz sonuçları bazen alamıyoruz. Poco model viewmodeller havalarda ucusyor birbirne aktarmalar falan ortalık savas alanına geliyor. Bir de foeach ıcınde bir list verım text alanlardan gelen datayı controller uzerınde alamamak benı çileden çıkartmaya yetiyor. For ile bir yere kadar oluyor ama orda da bambaşka sıkıntılar olusuyor. MVC garip bir dünya :)