ASP.NET MVC 5 - LINQ查询从数据库中选择数据

问题描述:

我正在研究ASP.NET MVC 5中的一个学校项目。该项目是关于创建一个社交网络。用户登录后,他会在他的新闻源中看到所有公开帖子。 虽然我在显示数据库公开帖子的数据时遇到了问题。ASP.NET MVC 5 - LINQ查询从数据库中选择数据

这是数据库的脚本:

create table Utilizador(
    id_utilizador  integer  not null identity(1,1), 
    nome    varchar(50) not null, 
    apelido    varchar(50) not null, 
    username   varchar(15) not null unique, 
    pass    varchar(50) not null, 
    email    varchar(50) not null unique, 
    sexo    char(1)  not null CHECK (sexo IN('M', 'F')), 
    país    varchar(50) not null, 
    imagem_perfil  varchar(50) not null, 
    data_nascimento  date  not null, 
    estado    int   not null default 2, --0->Bloqueado 1-Activo, 2-por activar 
    primary key (id_utilizador), 
    check (email LIKE '%@%.%') 
    ) 

    create table Post(
    id_post   integer   not null identity(1,1), 
    texto   varchar(400) not null, 
    primary key(id_post) 
    ) 

    create table Publish_Post(
    id_post   integer   not null, 
    id_utilizador integer   not null, 
    data   timestamp  not null, 
    primary key(id_post), 
    foreign key(id_post) references Post(id_post), 
    foreign key(id_utilizador) references Utilizador(id_utilizador) 
    ) 

    create table Privacy(
    id_privacidade integer  not null identity(1,1), --> 1 public, 2 private 
    nome   varchar(50) not null, 
    primary key(id_privacidade) 
    ) 

    create table Have_Privacy(
    id_post   integer  not null, 
    id_privacidade integer  not null, 
    primary key(id_post), 
    foreign key(id_post) references Post(id_post), 
    foreign key(id_privacidade) references Privacidade(id_privacidade) 
    ) 

让我解释一下为什么我创建数据库我的方式: 用户创建并发布一些帖子说有就有了隐私值(1或2)。用户登录后,所有公开帖子(1)应显示在他的新闻源中。 到目前为止,我有在C#这LINQ查询:

var id_posts = from p in db.Posts 
          select p.texto; 

      ViewBag.Posts = id_posts; 

有人能帮助我吗? 感谢提前:)

只是这样做

var id_posts = from p in db.Posts 
      join hp in db.Have_Privacy on p.id_post equals hp.id_post 
      join prv in db.Privacy on hp.id_privacidade equals prv.id_privacidade 
      where prv.nome = 'Private' 
      select p.texto; 

告诉它如何去

为什么不直接在Post添加一个字段叫isprivate与布尔类型的BIT决定,如果是私人或不,然后使用查询提供的数据与where条款:

var id_posts = from p in db.Posts 
         where isprivate == false 
         select p.texto; 

如果你想拥有超过200种的隐私和只是DB模式坚持你提供,你可以用一个JOIN去:

如果ID决定它是私有的:

var id_posts = from p in db.Posts 
      join hp in db.Have_Privacy on p.id_post equals hp.id_post 
      where hp.id_privacidade = 1 
      select p.texto; 

如果名字决定它是私有的:

var id_posts = from p in db.Posts 
      join hp in db.Have_Privacy on p.id_post equals hp.id_post 
      join prv in db.Privacy on hp.id_privacidade equals prv.id_privacidade 
      where prv.nome = 'Private' 
      select p.texto; 

同时请注意,命名其他一种语言表和列被认为是不好的设计。即使我知道它应该是什么意思,但其他人(在这个例子中)很难读取它。 最后两个查询使用您的模式,没有执行任何更改。

+0

感谢您对对策的探讨,但后可以有很多类型的隐私:/ –

+0

,但我需要有一个表只是为了隐私,教授订单 - 但是,无论如何,谢谢你:) –

+0

我改变了一个查询,所以它直接使用你的数据库模式。现在有什么问题?如果它解决了您的问题,请将其标记为已回答。如果没有,让我知道它不符合什么要求。 – mwilczynski