2015-05-26 11 views
28

Jak mogę zapytać o relację wiele do wielu za pomocą kodu Entity Framework first i linq? Problem polega na tym, że EF tworzy automatycznie tabelę relacji. Tak więc nie mam tego w moim kontekście.Zapytanie o relację wiele do wielu za pomocą linq/Entity Framework. CodeFirst

To jest model relacyjny:

enter image description here

muszę listę artykułów dla danego category_id zasadniczo replikować coś takiego:

select a.Id, a.Title,a.ShortDescription      
from Articles a 
join CategoryArticles ca on ca.Article_Id=a.Id 
where ca.Category_Id = @parameter 

Jednak moja dbcontext tylko:

public DbSet<Article> Articles { get; set; } 
public DbSet<Category> Categories { get; set; }. 

Dzięki za wszelkie Wsparcie.

Odpowiedz

32

Można to zrobić:

var cat_id=1; // Change this variable for your real cat_id 

var query= from article in db.Articles 
      where article.Categories.Any(c=>c.Category_ID==cat_id) 
      select article; 

W ten sposób można uzyskać artykułów, które spełnia warunek chcesz. Jest to kod SQL, który jest generowany przez tego zapytania:

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Title] AS [Title] 
    FROM [dbo].[Articles] AS [Extent1] 
    WHERE EXISTS (SELECT 
     1 AS [C1] 
     FROM [dbo].[ArticleCategories] AS [Extent2] 
     WHERE ([Extent1].[Id] = [Extent2].[Article_Id]) AND ([Extent2].[Category_Id] = @p__linq__0)) 
+0

Dzięki tak much.It działało idealnie. –

+1

Jest to niepoprawne, EF nie jest wystarczająco inteligentny, aby używać złączeń. Zamiast tego utworzy instrukcję EXISTS. Wydajność może być tutaj problemem. – Talon

+0

@Talon, teraz przetestowałem to zapytanie i prawdą jest, że dostawca EF 6.x Linq generuje 'Exist'' zamiast' join'. Dzięki za opinie. Uzgodniłem z tobą o wydajności, ale jeśli pominiesz stół łączący jako część swojego modelu, jest to jedyny sposób, aby to zrobić. – octavioccl

5

Jak o

db.Categories.Where(c => c.Id == categoryId).SelectMany(c => c.Articles)? 

To powinno działać w porządku (produkować odpowiednią dołączył instrukcji SQL.)

+0

gdzie jest "a"? Czy mógłbyś wyjaśnić, co masz na myśli? –

+0

Powinno to być 'c => c.Artyki'. Spowoduje to dołączenie do każdej listy artykułów kategorii wybranych z zapytania Gdzie. –

+0

Świetne, to jest właściwe rozwiązanie. EF wygenerował INNER JOIN zamiast WHISTE EXISTS. Z EXISTS jest bardzo wolny. –

1

po prostu wpadł na ten i pomyślałem, że opublikuję rozwiązanie, które znalazłem dla każdego, kto natknie się na tę stronę. W ten sposób powstaje INNER JOIN.

var category_id = 24; 

var query = (from article in Articles 
      from category in article.Categories.Where(x => x.Category_ID == category_id) 
      select article); 
0

Jeśli chcesz po prostu całą tabelę tym wszystkich relacjach, może spróbować czegoś takiego:

List<CategoryArticle> rec = context.Category.SelectMany(a => a.Articles.Select(c => new CategoryArticle { Category_Id = c.Id, Article_Id = a.Id })).ToList(); 
0

Przykład metoda LINQ składni

int category_ID = 1; 

var query = db.Articles 
    .Where(a => a.Categories 
    .Any(c => c.Category_ID == category_ID)) 
    .ToList(); 
Powiązane problemy