У меня есть модель блога и модель комментариев блога. В блоге есть коллекция комментариев к блогу, связанных с ним, однако, когда я получаю все свои блоги, чтобы я мог их перечислить на какой-то странице резюме, я тоже не хочу получать все комментарии, я только нужны комментарии, когда я выбираю конкретный блог и перехожу на его страницу. Тем не менее, я хочу, чтобы количество комментариев отображалось в сводном разделе.Игнорированное свойство, не возвращенное в хранимой процедуре
Я создал хранимую процедуру для извлечения блогов, которые не возвращают комментарии, но возвращает значение для количества комментариев, связанных с блогом.
При выборе конкретного блога я просто позволю EF захватить его для меня, а не использовать хранимую процедуру.
Проблема, с которой я сталкиваюсь, заключается в том, что я не хочу, чтобы счетчик комментариев был столбцом в таблице блога, поэтому изначально я думал, что должен игнорировать его в методе OnModelCreating, используя свободное api. Однако это означает, что когда я запускаю свою хранимую процедуру, она не возвращает значение, которое должна мне предоставить моя хранимая процедура.
Блог Класс:
public class Blog
{
public Guid BlogGuid { get; set; }
public string Title { get; set; }
public string Text { get; set; }
public string Author { get; set; }
public DateTime DatePosted { get; set; }
public IList<BlogComment> Comments { get; set; }
public int CommentCount { get; set; }
public Blog()
{
Comments = new List<BlogComment>();
}
}
Блог Комментарий Класс:
public class BlogComment
{
public Guid BlogCommentGuid { get; set; }
public Guid BlogGuid { get; set; }
public int ContactRef { get; set; }
public DateTime DatePosted { get; set; }
public string Text { get; set; }
}
OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var blog = modelBuilder.Entity<Blog>();
blog.ToTable("Blogs");
blog.HasKey(b => b.BlogGuid);
blog.HasMany(b => b.Comments).WithRequired().HasForeignKey(c => c.BlogGuid);
blog.Ignore(b => b.CommentCount);
var blogComment = modelBuilder.Entity<BlogComment>();
blogComment.ToTable("BlogComments");
blogComment.HasKey(c => c.BlogCommentGuid);
}
Получить Блоги Метод:
public IList<Blog> GetBlogs()
{
return context.Database.SqlQuery<Blog>("Get_Blogs").ToList();
}
хранимой процедуры Код:
CREATE TABLE #Blogs
(
BlogGuid uniqueidentifier,
Title nvarchar(50),
Text nvarchar(MAX),
Author nvarchar(50),
DatePosted datetime
)
IF (@BlogCount IS NOT NULL AND @BlogCount > 0)
BEGIN
INSERT INTO #Blogs
SELECT TOP (@BlogCount) *
FROM Blogs
ORDER BY DatePosted DESC
END ELSE BEGIN
INSERT INTO #Blogs
SELECT *
FROM Blogs
ORDER BY DatePosted DESC
END
SELECT *,
(SELECT COUNT(*)
FROM BlogComments
WHERE BlogComments.BlogGuid = #Blogs.BlogGuid) CommentCount
FROM #Blogs
DROP TABLE #Blogs
При вызове GetBlogs()
, CommentCount
всегда равна нулю, даже если блоги есть комментарии в блоге комментарий таблицы.
Думаю, я понимаю, почему это происходит, я просто не могу придумать решение.
Конечно, это означает, что я извлечения всех комментариев, так что я могу считать их хотя? Этого я пытаюсь избежать - ненужно загружать все комментарии, где я им не нужен. –
@ AndyFurniss беспокоится о том, чтобы сначала начать работу. Если после этого вы обнаружите, что у вас проблемы с производительностью, вы можете работать над такими оптимизациями. – user1666620
Да, у меня все было без работы с этим комментарием, а затем начал пытаться реализовать его, как только я понял, что бессмысленно возвращать все комментарии из базы данных.Подсчет комментариев в базе данных, безусловно, менее дорогостоящий, чем отправка их через Интернет? –