Много-много запросов в Entity Framework 4 - PullRequest
4 голосов
/ 08 апреля 2011

В моей базе данных есть отношения многие ко многим.Две конечные таблицы - это BlogPost и Item, а таблица посередине - ItemBlogPost.Мне нужно вернуть все BlogPosts, связанные с конкретным элементом.В SQL я бы сделал это так:

SELECT BlogPost.*
FROM BlogPost
    JOIN ItemBlogPost ON BlogPost.ID = ItemBlogPost.BlogPost_ID
WHERE ItemBlogPost.Item_ID = @Item_ID

В C # у меня есть нечто похожее:

IQueryable<BlogPost> itemBlogPosts = from b in connection.BlogPosts
                                     where b.Items == item.ID 
                                     orderby b.Content.CreateDate descending
                                     select b;

Однако строка, помеченная b.Items, не дает мне списокСвойства Item и b.ItemBlogPost отсутствуют, чтобы посмотреть промежуточную таблицу.Я также попытался сделать b.Items.Contains(item), но это также не удалось.Как я могу заставить это работать в LINQ to EF4?

Ответы [ 3 ]

22 голосов
/ 08 апреля 2011

Что по этому поводу:

var itemBlogPosts = from i in connection.Items
                    from b in i.BlogPosts // I suppose you have a nav. property on Item
                    where i.Id == itemId
                    select b; 

Тот же запрос также может быть определен как:

var itemBlogPosts = connection.Items
                              .Where(i => i.Id == itemId)
                              .SelectMany(i => i.BlogPosts);
2 голосов
/ 08 апреля 2011

Можете ли вы просто сделать это:

var itemBlogPosts = connection.Items.Single(b => b.ID == item.ID).BlogPosts;

Поскольку вы используете EF, он должен обрабатывать сопоставление «многие ко многим», и вы должны иметь BlogPosts в качестве элемента навигации в вашем объекте Item.

0 голосов
/ 08 апреля 2011

Если:

  1. Вы сгенерировали модель из базы данных (поэтому не модель-первая)
  2. Таблица соединений содержит ровно два внешних ключа (бездополнительные столбцы)
  3. Внешние ключи были настроены правильно

Тогда:

  1. EF сгенерировал бы для вас классы, которые содержат таковыеназываются навигационные свойства на «обеих сторонах».Свойство навигации (коллекция элементов) в BlogPost и nav.prop.(коллекция BlogPosts) на Item.

Таким образом:

  1. Вы можете пройти двунаправленный граф объектов.Получение всех блогов для определенного элемента или наоборот для получения всех элементов для определенного поста.

Так что, когда у вас есть конкретный элемент, вы можете просто создать коллекцию связанных постов с помощьюделать:

Item item = context.Items.Include("BlogPosts").FirstOrDefault<Item>(i => i.ID = someID)

Теперь у вас есть определенный элемент с заполненной коллекцией блогов (если они были связаны с этим элементом).

...