Список доступа EF core через Включить - PullRequest
0 голосов
/ 27 мая 2019

У меня есть модель с именем Блог :

public class Blog
    {
        [Key]
        public int blogId { get; set; }
        [Required]
        public string blogTitle { get; set; }
        public string imagePath { get; set; }
        [Required, DataType(DataType.Html)]
        public string blogDescription { get; set; }
        [DataType(DataType.DateTime)]
        public DateTime blogDateTime { get; set; }
        [Required]
        public bool isPublished { get; set; }

        [Required]
        public BlogCategory blogCategory { get; set; }
        public List<Comments> blogComments { get; set; }
    }

И еще одна модель Комментарий :

public class Comments
    {
        [Key]
        public int authorId { get; set; }
        [Required]
        public string commentAuthor { get; set; }
        [DataType(DataType.Date)]
        public DateTime commentDate { get; set; }
        public bool isHidden { get; set; }
        [Required, DataType(DataType.EmailAddress)]
        public string commentAuthorEmail { get; set; }
        [Required]
        public string commentDescription { get; set; }
        public Blog Blog { get; set; }
    }

В контроллере блогов я хочу получить доступ ко всем комментариям, где isHidden = false

То, что я пробовал, это:

var blog = await _context.Blog
           .Include(cat => cat.blogCategory)
           .Include(comments => comments.blogComments.Any(c => !c.isHidden))
           .FirstOrDefaultAsync(m => m.blogId == id);

Но я получаю исключение только

An unhandled exception occurred while processing the request.
InvalidOperationException: The Include property lambda expression 'comments => comments.blogComments.Find(c => Not(c.isHidden))' is invalid. The expression should represent a property access: 't => t.MyProperty'. To target navigations declared on derived types, specify an explicitly typed lambda parameter of the target type, E.g. '(Derived d) => d.MyProperty'.

Как я могу решить эту проблему?

Ответы [ 4 ]

0 голосов
/ 28 мая 2019

Вы должны использовать проекции каркаса сущности.

var blog = await _context.Blog
.Select(p => new Blog
{
    blogComments  = p.blogComments.Where(s => !s.isHidden )
}.FirstOrDefaultAsync(m => m.blogId == id);
0 голосов
/ 27 мая 2019
var blog = await _context.Blog
       .Include(cat => cat.blogCategory)
       .Include(comments => comments.blogComments)
       .Select(x=> {
            x.blogCategory = x.blogCategory;
            x.blogComments = x.blogComments.Where(y=>!y.IsHidden)
       })
       .FirstOrDefaultAsync(m => m.blogId == id);

Поскольку это IQueryable, результат будет тот же. Он будет возвращать только те комментарии, где комментарии в блоге скрыты. Это с учетом того, что вы хотите вернуть все блоги, а не только блоги, комментарии которых скрыты.

0 голосов
/ 28 мая 2019

Вы не можете выполнить фильтрацию в Include в ядре EF, попробуйте использовать приведенный ниже код

var blog = await _context.Blog
       .Include(cat => cat.blogCategory)
       .Include(comments => comments.blogComments)
       .FirstOrDefaultAsync(m => m.blogId == id);

blog.blogComments = blog.blogComments.Where(b => b.isHidden == false).ToList();

См. Фильтрация при включении в EF Core

0 голосов
/ 27 мая 2019

Значение bool верно для false, поэтому попробуйте: // непроверенный

(comments => comments.blogComments.where(c=>c.isHidden==false))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...