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

标签 c# linq entity-framework inheritance

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

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

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

PostLike:PostId

CommentLike:CommentId

ReplyLike:ReplyId

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

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

  2. User2 喜欢您的评论(CommentId 应附加到此评论中) 项目)

  3. 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 次查询似乎很繁重。

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

如果您希望继承的类像您的示例一样,至少要重构,这样您只需访问数据库一次:

var likes = db.Like.ToList();

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

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

相关文章:

entity-framework - Entity Framework 4.3代码中的错误优先-索引已存在

c# - 使用 Linq 的行号

c# - 从 C# 代码集成 quickbooks 的最佳方法是什么?

c# - Ti 和 Ti+1 的通用方法

c# - 使用不同的扩展名将文件上传到SFTP服务器

c# - 自定义网格 LINQ to SQL

c# - 通过导航属性加入的 Lambda 语法?

linq - 在 Entity Framework 中运行复杂的行查询时,查询在哪里运行?

c# - Visual Studio 不断删除 form.designers 中的代码

c# - 我需要根据复选框列表选择特定的列