Я только начал изучать LINQ2SQL, и одна из первых вещей, которые я хотел попробовать, - это простая иерархия родитель-потомок, но я не могу найти хороший способ сделать это. Я видел некоторые примеры здесь на SO, и я погуглил, но я не мог применить их напрямую, поэтому я объясню, что именно я пытаюсь достичь.
Позволяет использовать общий пример с тегами.
Таблицы базы данных: Post-- Post_Tags - Теги
Я создал простой класс Post, поэтому я избегаю передавать классы Linq2Sql:
public class Post
{
public int Id {get; set;}
public int Title {get; set;}
public IEnumerable<string> Tags {get; set;}
}
Я хотел бы выбрать 5 последних записей из таблицы «Посты», получить связанные с ними теги и вернуть список IList, где для каждого поста заполнено свойство «Теги».
Можете ли вы показать мне конкретный код Linq2Sql, как я могу это сделать?
Я пытался:
IList<Post> GetLatest()
{
return (from p in _db.Posts
orderby p.DateCreated descending
select new Post
{
Id = p.Id,
Title = p.Title,
Tags = p.Post_Tags.Select(pt => pt.Tag.Name)
}).Take(5).ToList();
}
Это работает, но дублирует записи Post для каждой записи Tag, и мне приходится дублировать сопоставление свойств (Id = p.Id, ...) в каждом методе, который я использую. Затем я попробовал этот подход, но в этом случае у меня есть обратный путь к БД для каждого тега:
IQueryable<Post> GetList()
{
return (from p in _db.Posts
select new Post
{
Id = p.Id,
Title = p.Title,
Tags = p.Post_Tags.Select(pt => pt.Tag.Name)
});
}
IList<Post> GetLatest()
{
return (from p in GetList()
orderby p.DateCreated descending
select p).Take(5).ToList();
}
Если бы я делал это в классическом ADO.NET, я бы создал хранимую процедуру, которая возвращает два набора результатов. Один с записями Post, а второй с соответствующими записями Tag. Затем я бы отобразил их в коде (вручную, через DataRelation, ORM и т. Д.). Могу ли я сделать то же самое с LINQ2SQL?
Мне действительно любопытно увидеть примеры кода о том, как вы, ребята, справляетесь с такими простыми иерархиями.
И да, я действительно хотел бы вернуть объекты IList <> и мои пользовательские классы, а не объекты запросов Linq в Sql, потому что я хотел бы проявлять гибкость в отношении кода доступа к данным, если я, например, решу отказаться от Linq2Sql.
Спасибо.