Many to Many İlişkisinde LinQ Sorgusu

Literary.

Megapat
Katılım
6 Ağustos 2014
Mesajlar
460
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
film.jpg Kategori.jpg FilmKategori.png

Arkadaşla, ASP üzerinde tablolarım bu şekilde. Veritabanıyla bağlantıları falan hallettim hiçbir sıkıntı yok.

sorgu.jpg

Yapmak istediğim sorgu şu: Örneğin 1 numaralı kategoriye ait filmleri sorgulayarak view üzerine göndermek. Ama bunun sorgusunu nasıl yazacağımı bulamadım. Benim mantığıma göre filmlerden moviecategories'a ulaşıp ondan da CategoryId==1 olan kayıtları seçmek. Lakin bunu yapamadım. Nasıl yapacağım?
 
Entity Framework mü kullanıyorsunuz?
Evet, kodlardan bariz olarak açık.

C#:
var category = db.MovieCategories.Where(c => c.CategoryId == CategoryId).FirstOrDefault();

var movies = db.Films.Where(f => f.MovieCategories.Contains(category)).ToList();

Bunu dene. Film nesnesine ait "MovieCategories" parametren bir liste. O yüzden bu şekilde erişmen gerek.
 
Evet, kodlardan bariz olarak açık.

C#:
var category = db.MovieCategories.Where(c => c.CategoryId == CategoryId).FirstOrDefault();

var movies = db.Films.Where(f => f.MovieCategories.Contains(category)).ToList();

Bunu dene. Film nesnesine ait "MovieCategories" parametren bir liste. O yüzden bu şekilde erişmen gerek.
Ben emin olup atmak istemiştim. Benden hızlısınız :)
 
Evet, kodlardan bariz olarak açık.

C#:
var category = db.MovieCategories.Where(c => c.CategoryId == CategoryId).FirstOrDefault();

var movies = db.Films.Where(f => f.MovieCategories.Contains(category)).ToList();

Bunu dene. Film nesnesine ait "MovieCategories" parametren bir liste. O yüzden bu şekilde erişmen gerek.

Movie categories tablosuna direkt erişemiyorum. Hocamız bize öğretirken db context kısmına MovieCategories'i eklemeyin zaten kategori veya filmlerden ulaşabilirsiniz demişti. Başka bir yolu var mı?

Edit: Ayrıca kodu denememe rağmen çalışmadı hata veriyor
 
Ne hatası aldın?

O zaman şöyle çalış.

C#:
var filmIdList = db.Categories.Where(x => x.Id == CategoryId).Select(x => x.MoviesCategories.FilmId).ToList();

/*Bu sana filmlerin İdlerini verecek.

Sonra filmlerden alırsın. Ben elle yazıyorum syntax hatası olabilir. O yüzden kontrol et.*/

var movies = db.Movies.Where(x => filmIdList.Contains(x.Id)).ToList();
 
var filmIdList = db.Categories.Where(x => x.Id == CategoryId).Select(x => x.MoviesCategories.FilmId).ToList();

hata.jpg
Hocam hata böyle. Hatanın sebebi şu: Context üzerinde MoviesCategories yok. Öğreten hocamız da bunu contexte eklemeyin diğer tablolardan erişip sorgularınızı yazabilirsiniz demişti.

context.jpg
Context bu. Yani x.MoviesCategories'e ulaşılamıyor.

Ayrıca Context üzerine MovieCategories'i ekledim yine de sorgu hata verdi. Bunun başka bir yolu olmalı.
 
Çünkü adı MoviesCategories değil MovieCategories. Veri tabanında ve Context'inde değiştireceğin bir şey yok.

Sana yazımımı kontrol et dedim. Elle yazıyorum.
hata2.jpg

Hocam anlatamıyorum sanırım. MovieCategories'in üzerinden bir şeye ulaşamıyorum. FilmId falan çıkmıyor hata veriyor.
 
Eki Görüntüle 743151

Hocam anlatamıyorum sanırım. MovieCategories'in üzerinden bir şeye ulaşamıyorum. FilmId falan çıkmıyor hata veriyor.
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();

Bunu dene bakalım. Ayrıca böyle bir erişim için MovieCategories sınıfını contexte eklersen daha kolay erişirsin. O zaman da şu şekilde olur.

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();
 
Son düzenleme:
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı