Метод запроса и подход, чтобы проверить, подписан ли пользователь на указанные новости и вернуть их - PullRequest
1 голос
/ 01 мая 2020

В настоящее время я работаю с Entity Framework Core и веб-приложением Net Core 2.1, узнавая, как указывать, подписан ли пользователь на указанные новости или нет.

Я провел день, пытаясь понять, как для этого случая используйте метод запроса Linq:

  1. У меня есть 3 таблицы (пользователи, новости и подписки)

    1.1. В таблице Subscriptions должен быть сохранен идентификатор новостей, который подписан пользователем (рядом с идентификатором пользователя)

  2. Предполагается, что когда пользователь подписывается, он может получать уведомления от новостей, в противном случае нет.

Моя проблема возникает, когда я пытаюсь проверить, подписан ли пользователь на указанные новости. Мне также нужно вернуть новости, на которые подписан человек (я в основном не могу правильно запросить). Я попробовал с Include() методом, но я чувствую, что что-то упустил.

Это мой код:

DataContext:

public class DataContext : IdentityDbContext<User, Role, string>
{
    public DbSet<News> News { get; set; }

    public DbSet<Subscription> Subscriptions { get; set; }

    public DataContext(DbContextOptions options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<Subscription>(s => 
        {
             s.HasKey(x => new
             {
                 x.UserId,
                 x.NewsId
             });
        });
    }
}

Сущность пользователя:

public class User : IdentityUser
{
     public string FirstName { get; set; }
     public string LastName { get; set; }

     public ICollection<Subscription> Subscriptions { get; set; }
}

News Сущность:

public class News
{
     public string Id { get; set; }
     public string Title { get; set; }
     public string Content { get; set; }

     public ICollection<Subscription> Subscriptions { get; set; }
}

Объект подписки:

public class Subscription
{
     public string UserId { get; set; }
     public string NewsId { get; set; }
     public News News { get; set; }
     public User User { get; set; }
}

NewsModel модель, используемая в представлении (UserModel содержит те же основные свойства, что и пользователь):

public class NewsModel
{
     public string Id { get; set; }
     public string Title { get; set; }
     public string Content { get; set; }

     public UserModel UserCreate { get; set; }
}

1 Ответ

1 голос
/ 02 мая 2020

User и News имеют отношение "многие ко многим", в которых Subscription является связью между обоими классами.

Общий шаблон для запроса ассоциаций "многие ко многим":

from news in context.News
from un in news.Subscriptions
let user = un.User
select ...

И теперь вы можете select любое свойство из news и user, чтобы представить данные обоих классов в едином списке.

select new NewsModel
{
    Id = news.Id,
    Title = news.Title,
    Content = news.Content,
    UserCreate = new UserModel
    {
        FirstName = user.FirstName,
        LastName = user.LastName
    }
}

Примечание: я бы использовал имя, подобное NewsItem, легче различать имена единственного и множественного числа.

...