我正在尝试在我的应用程序中实现Like
功能(类似于Facebook)。我将拥有三种类型的点赞:对帖子的点赞、对评论的点赞(对帖子的点赞)以及对回复的点赞(对评论的点赞)。稍后,基于 like
事件,我想为用户生成动态通知列表。
对于这个任务,我认为继承会很好用,所以我有以下类(Like
是基类)
喜欢
:LikeId、LikeDate、WhoLiked、WhoseLiked、IsNotificationRead
PostLike
:PostId
CommentLike
:CommentId
ReplyLike
:ReplyId
我需要生成一个如下所示的通知列表:
用户 1 喜欢您的帖子(
PostId
应附加到此项目)User2 喜欢您的评论(
CommentId
应附加到此评论中) 项目)User3 喜欢您的回复(
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 次查询似乎很繁重。
一个简单的实现是拥有一个具有 TargetId
和 TargetType
属性的 Like
类,然后根据值调整文本TargetType
的。您不会以这种方式获得导航属性,但您可能不需要它们。
如果您希望继承的类像您的示例一样,至少要重构,这样您只需访问数据库一次:
var likes = db.Like.ToList();
var postLikes = likes.OfType<CommentLike>()...
关于c# - EF代码优先中使用继承的困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29837076/