Я потратил кучу времени, чтобы заставить Entity Framework делать то, что я хочу.Я пишу агрегатор каналов, чтобы я мог добавить несколько RSS-каналов в «FeedList», который сгруппирует все отдельные подкасты и упорядочит их по pubDate.
Классы (все, кроме FeedListFeed, имеют столбец идентификации с именем Id):
- Feed (Id - первичный ключ удостоверения, имеет свойство List Items)
- FeedItem (Id - первичный ключ удостоверения, как свойства int FeedId и Feed Feed)
- FeedList(FeedListName является строкой и свойством List Feeds)
- FeedListFeed (таблица привязок «многие ко многим», свойства FeedListId и FeedId)
Кажется, что эти отображения работают:*
Теперь я хочу получить последние 20 записей FeedListItem для Feeds в FeedList с учетом FeedListName.Я придумал это, но есть ли лучший способ сделать это?Будет ли запрос фактически расширять все элементы или он будет достаточно умен, чтобы делать это на стороне SQL?
var query =
from fl in ctx.FeedLists.Include("Feeds").Include("FeedItems")
from f in fl.Feeds
from fi in f.Items
where fl.FeedListName == id
orderby fi.PubDate descending
select fi;
List<FeedItem> items = query.Take(20).ToList();
Если я попытаюсь связать таблицы вручную, используя столбцы Id, я получу ошибку Invalid object name 'dbo.FeedListFeeds1'.
Если бы я вынул списки, связывающие таблицы друг с другом, это помогло бы?Есть ли какое-то другое сопоставление, которое позволяет этой работе?
var query =
from fl in ctx.FeedLists
join flf in ctx.FeedListFeeds on fl.Id equals flf.FeedListId
join fi in ctx.FeedItems on flf.FeedId equals fi.FeedId
where fl.FeedListName == id
orderby fi.PubDate descending
select fi;