gpt4 book ai didi

c# - 在 EF 代码优先中使用继承的困境

转载 作者:太空宇宙 更新时间:2023-11-03 10:31:49 26 4
gpt4 key购买 nike

我正在尝试在我的应用程序中实现Like 功能(类似于 Facebook)。我将拥有三种类型的 Like:喜欢帖子、喜欢评论(对帖子)和喜欢回复(对评论)。后来,基于 like 事件,我想为用户生成一个动态通知列表。

对于这个任务,我认为继承会很好,所以我有以下类(Like 是基类)

喜欢 : LikeId, LikeDate, WhoLiked, WhoseLiked, IsNotificationRead

PostLike: PostId

CommentLike: CommentId

ReplyLike: 回复Id

我需要生成一个如下所示的通知列表:

  1. 用户 1 喜欢您的帖子(PostId 应附加到此项目)

  2. 用户 2 喜欢您的评论(CommentId 应该附加到此)项目)

  3. 用户 3 喜欢您的回复(ReplyId 应附加到此项目)

但是,过去 2 天我很难生成此输出。最后,我得出结论,我不能在单个 LINQ 语句中使用 dbcontext.Likes 来获得此输出。

我计划为每个继承的实体分别生成列表并在最后合并所有列表:

  var postlikes = db.Like.OfType<PostLike>().Select(a => 
new {Text = "User1 liked your post", ItemId=a.PostId, Type="Post"});

var commentlikes = db.Like.OfType<CommentLike>().Select(a =>
new {Text = "User1 liked your comment", ItemId=a.CommentId, Type="Comment"});

var replylikes = db.Like.OfType<ReplyLike>().Select(a =>
new {Text = "User1 liked your reply", ItemId=a.ReplyId, Type="Reply"});

您认为我实现继承的方式在这种情况下有意义吗?你推荐另一种方法吗?你觉得我这里需要继承吗?

谢谢

最佳答案

除非您从示例中删除了其他成员,否则您的方法似乎有点过分了。再加上做 3 个查询只是为了获得喜欢的通知似乎很重。

一个简单的实现是拥有一个带有 TargetIdTargetType 属性的 Like 类,然后根据值调整文本目标类型。您不会以这种方式获得导航属性,但您可能不需要它们。

如果你想要像你的例子那样的继承类,至少要重构,这样你只访问数据库一次:

var likes = db.Like.ToList();

var postLikes = likes.OfType<CommentLike>()...

关于c# - 在 EF 代码优先中使用继承的困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29837076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com