如何从派生 类 创建匿名类型列表 - EF Code First
How to create an anonymous type list from derived classes - EF Code First
我有以下 classes:
Base Class: Like
有 IsRead
, WhoLikedId
, WhoseLikedId
属性。
Derived Classes: PostLike
多了一个 PostId
属性, CommentLike
多了一个CommentId
属性, ReplyLike
还有一个 ReplyId
属性.
基于likes
,我想生成一个通知列表。我可以像这样针对每个派生的 class 分别执行此操作:
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
的方式是好的做法吗?
查看匿名类型: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()
) 个未读的、最新的或适合您的应用程序的任何内容。
- 你有一个机制 在某个地方 可以根据类似的类型名称为
Text
获得 string
。
Like
基础 class 具有通用 ID,而不是 PostId
、CommentId` 等
我有以下 classes:
Base Class: Like
有 IsRead
, WhoLikedId
, WhoseLikedId
属性。
Derived Classes: PostLike
多了一个 PostId
属性, CommentLike
多了一个CommentId
属性, ReplyLike
还有一个 ReplyId
属性.
基于likes
,我想生成一个通知列表。我可以像这样针对每个派生的 class 分别执行此操作:
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
的方式是好的做法吗?
查看匿名类型: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()
) 个未读的、最新的或适合您的应用程序的任何内容。 - 你有一个机制 在某个地方 可以根据类似的类型名称为
Text
获得string
。 Like
基础 class 具有通用 ID,而不是PostId
、CommentId` 等