gpt4 book ai didi

c# - IQueryable 来自 Code First Entity Framework 的两个表

转载 作者:行者123 更新时间:2023-11-29 06:51:11 24 4
gpt4 key购买 nike

我有一个看似简单的帖子表,其中包含多个投票,如下所示:

帖子:

namespace Api.Models
{
public class Post
{
public int id { get; set; }
public bool deleted { get; set; }
public virtual User creator { get; set; }

(...)

public virtual ICollection<Vote> votes { get; set; }
}
}

投票:

namespace Api.Models
{
public class Vote
{
public int id { get; set; }
public bool seen { get; set; } = false;

(...)

[JsonIgnore]
[IgnoreDataMember]
public virtual ICollection<Post> post { get; set; }
}
}

这在 SQL 数据库中生成了一个 VotePost 表,其中 Vote_id 和 Post_id 作为外键。

如果帖子有 0 票或所有投票都被看到,我试图仅获取与带有 p.creator.user_id 的帖子相关的见过 == false 的投票。那么我就不需要返回post元素了

帖子有多个投票对象,我不知道如何过滤掉所有投票。seen == false

        IQueryable<Post> postQuery = (from p in db.Posts where 
p.deleted == false &&
p.creator.user_id == user_id &&

// all p.votes object seen == false ?

select p);

预先感谢您的帮助

最佳答案

所以你有用户、帖子和投票。

有一个one-to-many relation创建者和帖子之间:每个创建者都有零个或多个帖子,每个帖子都属于一个创建者。

似乎有a many-to-many relation between Posts and Votes:每个帖子都有零个或多个投票,每个投票都支持零个或多个帖子。

我不确定您为什么选择偏离标准 Entity Framework 约定并省略类定义的外键。这只会让你的查询变得更加困难。但我们必须按照您的设计进行操作。

你写道:

I am trying to only get the Votes that seen == false that are connected to the post with p.creator.user_id, if the post has 0 votes or all votes are seen. Then I don't need to return the post element

我认为这是一种困难且有点模棱两可的表达方式:

给定一个变量 user_id,它是用户的主键。给我一个查询,该查询会产生所有未看到的投票,这些投票具有主键 user_Id 的创建者帖子。

var result = dBContext.Votes
.Where(vote => !vote.Seen
&& vote.Posts.Any(post => post.Creator.user_id == user_id);

如果您在类中包含外键,它甚至会更简单:

class User
{
public int Id {get; set;} // primary key
// a User has zero or more Posts:
public virtual ICollectioins<Post> Posts {get; set;}
...
}
class Post
{
public int Id {get; set;} // primary key

// Every Post belongs to exactly one User via foreign key
public User User {get; set;}
public int UserId {get; set;}

// a Post has zero or more Votes (many-to-many)
public virtual ICollection<Vote> Votes{get; set;}
...
}

class Vote
{
public int Id {get; set;} // primary key
// A vote is for zero or more Posts (many-to-many)
public virtual ICollection<Post> Posts{get; set;}

public bool Seen {get; set;}
}

您可能对某些属性的命名不同,但您明白了要点。

一旦您将外键包含到帖子的用户中,您的查询就变得更加简单:

 var result = dBContext.Votes
.Where(vote => !vote.Seen
&& vote.Posts.Any(post => post.userid == user_id);

建议:每当您想到偏离 entity framework code first conventions 时,例如对主键和外键使用非常规名称,对 ICollection 属性使用非常规名称等。请三思:这种偏差真的需要吗?

偏离意味着需要流畅的Api,或者说属性。维护:其他人不会立即明白你的意思。您的查询可能会变得更加困难

关于c# - IQueryable 来自 Code First Entity Framework 的两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47400596/

24 4 0