在EF代码中首先使用继承的困境

时间:2015-04-24 01:19:08

标签: c# linq entity-framework inheritance

我正在尝试在我的应用程序中实现Like功能(类似于Facebook)。我将有三种类型Like s:喜欢帖子,喜欢评论(发帖),喜欢回复(评论)。稍后,根据like活动,我想为用户生成动态通知列表。

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

Like:LikeId,LikeDate,WhoLiked,WhooseLiked,IsNotificationRead

PostLike:PostId

CommentLike:CommentId

ReplyLike:ReplyId

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

  1. User1喜欢您的帖子(PostId 应附加到此商品

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

  3. User3喜欢您的回复(ReplyId 应附加到此商品上)

  4. 但是,我很难在过去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"});
    

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

    由于

1 个答案:

答案 0 :(得分:2)

除非你的例子中没有其他成员,否则你的做法似乎有点过分。另外做3个查询只是为了获得通知的喜欢似乎很重。

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

如果你希望你的继承类像你的例子,至少重构,所以你只打了一次数据库:

var likes = db.Like.ToList();

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