Many to Many İlişkisinde LinQ Sorgusu



Yok hocam yine hata veriyor. MovieCategories'e ulaşılamıyor. Sen çoka çok tablolarla uğraşırken ulaşabiliyor muydun bu kodlarla? Acaba benim projemde mi bir sorun var? Yoksa başka bir yolu mu var bunun?
 
Ben sıkıntı yaşamadan ulaşıyorum. Önceki mesajımı tekrar oku bir şey yazdım. Kodu yanlış yazmışım. Düzgün hali bu.

C#:
var categoryList = db.Categories.Where(x => x.Id == CategoryId).ToList();
var filmIdList = new List<int>();

foreach (var category in categoryList){
    var movieCategories = category.MovieCategories;
    var categoryMovieIdList = movieCategories.Select(x => x.FilmId).ToList();
    filmIdList.AddRange(categoryMovieIdList);
}

var movies = db.Movies.Where(x => filmIdList.Contains(x.Id)).ToList();
 


Hocam burdaki kod bu hatayı verdi. Önceki mesajda yazdığını da denedim MovieCategories'i Contexte eklememe rağmen yine hata verdi.
 
Bence tablo yapinda cok hata var.

- Category ve MovieCategory ayni sey.
- MovieCategory hem categoryId hem de Category tutuyor. Film tutmasina gerek yok.
- List<> yerine set kullanmalisin, duplike kategori olmamasi adina.
- Film yazdiysan FilmKategorisi yap diger tablonun adini, ya full Turkce ya da full Ingilizce devam et.

Bence yol yakinken tablo yapisini degistir. Soyle bir sey:

Movie
- name,desc, id vs
- set<MovieCategory>

MovieCategory
- id
- name
- description

3 tane tablo olusturacak framework bu yapidan.
 

Hocam çoka çok ilişki olduğu için MovieCategory tablosu var. Category ve MovieCategory aynı şey değil. Bir film birden fazla kategoriye ait olacağı için ve bir kategoride birden fazla film olacağı için böyle bir tablo yapısı kurdum.
 
Hata veren satırı aşağıdaki gibi yap bakalım. Projeyi atarsan sana daha düzgün hale getirebilirim. Bu şekilde hataları görmeden yapmak çok zor.

C#:
var categoryMovieIdList = movieCategories.Select(x => x.FilmId).ToList();

Ayrıca MovieCategories sınıfını contexte eklediysen aşağıdaki gibi yap. Bunu mutlaka dene.

C#:
var filmIdList = db.MovieCategories.Where(x => x.CategoryId == id).Select(x => x.FilmId).ToList();
var movies = db.Movies.Where(x => filmIdList.Contains(x.Id)).ToList();
 
Evet dusuncen dogru. Iliskileri tutmak icin 3. bir tabloya ihtiyacin var. Ama bunu sen degil EntityFramework olusturmali. Sen uygulamanda SQL gibi degil "Entity" gibi dusunmelisin.

Yani 2 tane Entity class i tanimla ve iliskilerini belirt, gerek gorurse framework baglanti icin 3. tabloyu kurar zaten.

Ayrica bir hiyerarsi de olmali. Filmler mi hangi kategoride olduklarini bilmeli, kategoriler mi hangi filmlerin kendisiyle iliskili oldugunu bilmeli? Kategorinin boyle bir derdi olmamali. Direction konusu bu.
 
Yani @bitwise'ın demek istediği şey şu.

Sen "Film" sınıfına MovieCategories sınıfını değil Categories sınıfını liste olarak tanımlamalısın. Set veya List kullanman çok fark etmiyor. Primary Key olduktan sonra.

"Category" sınıfında da liste olarak "Film" sınıfını ilişki göstermen gerekiyor.

Gerisini sana Entity Framework halledecek ama ben diğer sınıfı görünce bunu elle kurmak istediğini düşündüm.
 

Hocam proje bu. Bakıp sorunları bulursan çok sevinirim.
 
Dosya.Co'dan indirme yapmam. Zaten forumda da yasaklı. Drive, Outlook veya Dropbox kullan.

Ayrıca önce dediklerimi dene.

 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…