如何从派生类创建匿名类型列表 - EF Code First

时间:2015-04-23 14:46:05

标签: c# linq entity-framework ef-code-first anonymous-types

我有以下课程:

基类: LikeIsReadWhoLikedIdWhoseLikedId属性。

派生类: PostLike有一个额外的PostId属性,CommentLike有一个额外的CommentId属性,ReplyLike有一个额外的ReplyId财产。

基于likes,我想生成一个通知列表。我可以按照这样的每个派生类单独执行此操作:

  var postlikes = db.Likes
                    .OfType<PostLike>
                    .Select(pl => new 
                         {
                            NotificationText = 'Someone liked your post.',
                            Type = "PostLike",
                            RelatedItem = pl.PostId
                         });

  var commentlikes = db.Likes
                    .OfType<CommentLike>
                    .Select(cl => new 
                         {
                            NotificationText = 'Someone liked your comment.',
                            Type = "CommentLike",
                            RelatedItem = cl.CommentId
                         });
  //the same for replylikes         

我想知道是否有办法使用 ONE LINQ 语句生成这样的列表?

如果没有,你认为我处理Likes的方式是一种好习惯吗?

1 个答案:

答案 0 :(得分:0)

在匿名类型上看到这一点:Return anonymous type results?

坚固的版本是你可能的,但不要。

最好使用视图模型,比如说NotificationsViewModel,其中包含您需要的字段,并从查询中返回。

  var likes = db.Likes
                .Take(10)
                .ToList()
                .Select(like => new NotificationsViewModel
                 {
                    Text = resolveNotificationString(like.GetType().Name),
                    Type = like.GetType().Name,
                    RelatedItem = like.Id
                 });

这会对您的模型/用例进行以下假设和一些隐式更改,

  • 这是用于填充视图
  • 假设你只想要前几个,因为它是为了一个视图。您可以过滤(Where())未读取的,最新的或适合您应用的任何内容。
  • 您有一个某处机制,可以根据类似名称获取string的{​​{1}}。
  • Text基类具有公共ID,而不是Like,CommentId`等。