Irepository Hakkında Ve Daha Fazlası
-
Bi eğitim serisi ile bu katmanlı mimariyi ögrenmeye çalışıyorum eğitim genel olarak iyi ama bazı yerleri hiç anlatmadan geçiyor bende oturmayıncada ilerleyemiyorum sorularım aşağıdaki gibi cevaplayan arkadaşlara şimdiden teşekkürler.
public interface IRepository<T> where T : class { // Tüm datamızı çekecek IEnumerable<T> GetAll(); //Tek bir data gelecek T GetById(int id); T Get(Expression<Func<T, bool>> expression); IQueryable<T> GetMany(Expression<Func<T, bool>> expression); void Insert(T obj); void Update(T obj); void Delete(int id); int Count(); void Save(); }
Şu şekilde bi IRepository var. Insert, update, delete, count, save kisimlarini anladım ama 2 tane farklı get yazdı id ye göre
T GetById(int id);
T Get(Expression<Func<T, bool>> expression);
Bu 2 sinin birbirinden farkı nedir acaba? GetById li olan kısmı anladım ama alttaki karmaşık geldi ve neden yazdığını anlayamadım
IEnumerable<T> GetAll();
IQueryable<T> GetMany(Expression<Func<T, bool>> expression);
Birde bu 2 kod satırı var birinde Enumerable digerinde Queryable kullanılmış enum ve query nin farkına baktım internetten query li olan diğerinden daha hızlıymış bu eğitimi çeken çocuk yanlışlıkla mı yapmış yoksa bi nedeni mi var birinde query birinde enum kullanılmasının ?
Son olarakta örneğin KullaniciRepository sayfasında yani bu implement işleminin gerçekleştiği yerde db yi alttaki şekilde çağarıyor
private readonly BlogContext _context = new BlogContext(); Bu kullanımın aşağıdaki kullanımdan farkı ne yani biri doğru biri yanlış mı yada birinin kullanıldığı yer ayrı diğerinin kullanıldığı yer ayrı mı ?
using (SqlConnection con = new SqlConnection(), con2 = new SqlConnection()) {
Yani bu using kullanımı nedir neden ve nasıl kullanılır benim bu readonly li kod blogumda bu using i kullanmama gerek var mı varsa nasıl kullanıcam yoksa neden yok? Soruların tümüne cevap vermenize gerek yok bildiklerinizi yazmanız yeterli
-
hizli hizli yazayim anlamadigin yer varsa sorarsin tekrar cikmam lazim cünkü.
1- bahsettigin int id bildigin normal fonksiyon parametresi, digerine predicate deniyor ve parametreye göre bool vermen lazim ama söyle mesela bu get fonksiyonunu cagirirken get(a=>a >10); seklinde cagirman gerek
2- IQueryable de aslinda IEnumerable den türemistir. Local listeler icin genelde IEnumerable, remote listeler icin (bellegin tasma olasiligi olma durumunda) digeri IQueryable. yani bir webservisin var ve oradan bi sonuc bekliyorsun ama ne kadar döner fikrin yok.. Bu gibi durumlarda IQueryable kullanilmasi daha uygun.
3- using keyword u IDisposable arayüzünden türeyen siniflarin instancelarini (örneklerini), isi bittikten sonra bellekten kaldirmak icin kullanilir. Yani SqlConnection sinifina bakinca muhtemelen IDisposable dan türedigini göreceksin.
using parantezinden sonra artik sql sinifindan olusturdugun instance (degisken diyelim) artik kullanamzsin, hem kodda gecerli degil hem de bellekte yok edilmis. Cünkü nesnenin Dispose metodu cagrilmis. Context i sürekli kullaniyorsan onu sürekli yok etmen gerekmez.O yüzden using olmadan cagrilmis. Ayrica using kullanmak icin dedigim gibi BlogContext sinifnin da IDisposable den türemis olmasi lazim
-
unbalanced bunu yazdı
Hocam cevapların için öncelikle teşekkürler 3.cevabını anladım ama 1-2 tam oturmadı şimdi 1.soru için
T GetById(int id);
T Get(Expression<Func<T, bool>> expression);
yani Expression<Func<T, bool>> expression bu kodu diğer getbyid den farklı olarak ne yapıyor? Bi duruma göre kullanılıyosa bana gerçekci bi örnek verebilir misin?
2.soru içinde IQueryable GetMany(Expression<Func<T, bool>> expression); bu kodun yazılacağı yer IRepository mi olmalı yani dediğin gibi ise bu kodu api bölümüne yazmamız gerekmiyomu çünkü irepository direk olarak db den çekicek verileri az çok ne kadar veri var tahmin edilebilir diye düşünüyorum yada bunu acaba arama yapmak için mi yazmış olabilir? Api yazmayı bilmiyorum ve katmanlı mimariye yeni başladım o yüzden sorularım çok basit yada anlamsız gelebilir
-
oyle bakarken denk geldi belki faydası olur..
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/expression-trees/index
-
ANZAK bunu yazdıunbalanced bunu yazdı
Hocam cevapların için öncelikle teşekkürler 3.cevabını anladım ama 1-2 tam oturmadı şimdi 1.soru için
T GetById(int id);
T Get(Expression<Func<T, bool>> expression);
yani Expression<Func<T, bool>> expression bu kodu diğer getbyid den farklı olarak ne yapıyor? Bi duruma göre kullanılıyosa bana gerçekci bi örnek verebilir misin?
2.soru içinde IQueryable GetMany(Expression<Func<T, bool>> expression); bu kodun yazılacağı yer IRepository mi olmalı yani dediğin gibi ise bu kodu api bölümüne yazmamız gerekmiyomu çünkü irepository direk olarak db den çekicek verileri az çok ne kadar veri var tahmin edilebilir diye düşünüyorum yada bunu acaba arama yapmak için mi yazmış olabilir? Api yazmayı bilmiyorum ve katmanlı mimariye yeni başladım o yüzden sorularım çok basit yada anlamsız gelebilir
unbalanced hocamın müsadesiyle ben anlatmaya çalışayım.
GetById ile yalnızca id'ye göre sorgulama yapabiliyorsun adından anlaşıldığı gibi. Expression<Func<T,bool>> türünde parametre alan Get methodunda ise o sınıfın herhangi bir propertysi ile sorgulama yapabilirsin. Örneğin;
var anzaklar = userRepository.Get(user => user.Name == "anzak"); var yasi30danBuyukler = userRepository.Get(user => user.Age > 30); var idsi5olanlar = userRepository.Get(user => user.Id == 5);
Görüldüğü gibi predicate kullanarak da idye göre sorgulama yapılabiliyor fakat id sorgusu çok sık kullanılabildiği için ayrı bir method yazma gereği duyulmuş.
Diğer soruda api olayı kafanı karıştırmasın, ilk aşamada tüm verileri veritabanından çektiğini düşünebilirsin. Veritabanında 10 tane de veri olabilir milyarlarca da. Tüm repository classların IRepositoryi implement edeceği için hangi tabloda ne kadar veri olacağını tahmin edemeyebilirsin. Mesela tahribat.com'da tüm kullanıcıların tüm işlemlerinin loglandığı bir tablo olduğunu varsay, 15 yıldan fazla zamandır tüm kullanıcıların tüm hareketleri o tabloya yazılıyor. Şu sorgunun kaç veri getireceğini şahsen ben tahmin edemiyorum: logRepository.Get(log => log.Date.Year > 2005);
-
MadJack bunu yazdıANZAK bunu yazdıunbalanced bunu yazdı
şimdi net oturdu hocam teşekkürler.
cybermole bunu yazdıoyle bakarken denk geldi belki faydası olur..
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/expression-trees/index
Teşekkürler hocam ama bu kadar ingilizcem yok :\