我有两个存储库(PostRepository和AlbumRepository),并且都从另一个PublicationRepository继承。
在PostRepository中我有这些预测
return queryBase.Select(x => new NewsFeed
{
Id = x.PublicationID,
Title = x.Title,
Content = x.Content,
CreatedDate = x.CreatedDate,
Link = x.Link,
Type = NewsFeedType.Post,
PostType = x.PostType,
OwnerId = x.UserID.HasValue ? x.UserID.Value : 0,
OwnerFirstName = x.User != null ? x.User.FirstName : "",
OwnerLastName = x.User != null ? x.User.LastName : "",
OwnerProfilePicture = x.User != null ? x.User.PhotoPath : "",
CommentsCount = x.PublicationComment.Count(),
ILike = x.Consultation.Any(c => c.ViewedByID == userId && c.ILike == true && c.DeletedFlag != true),
IsSignaled = x.Consultation.Any(c => c.ViewedByID == userId && c.IsSignaled == true && c.DeletedFlag != true),
RecommendationCount = x.Consultation.Count(c => c.DeletedFlag != true && c.ILike == true),
TargetPopulations = x.Access.Select(a => a.Population.PopulationName).ToList(),
OwnerIsMyManager = promoManagerIds.Contains(x.UserID)
});
在AlbumRepository中我有这些
return queryBase.Select(x => new NewsFeed
{
Id = x.PublicationID,
Title = x.AlbumName,
CreatedDate = x.CreatedDate,
Type = NewsFeedType.Album,
OwnerId = x.UserID.HasValue ? x.UserID.Value : 0,
OwnerFirstName = x.User != null ? x.User.FirstName : "",
OwnerLastName = x.User != null ? x.User.LastName : "",
OwnerProfilePicture = x.User != null ? x.User.PhotoPath : "",
CommentsCount = x.PublicationComment.Count(),
ILike = x.Consultation.Any(c => c.ViewedByID == userId && c.ILike == true && c.DeletedFlag != true),
IsSignaled = x.Consultation.Any(c => c.ViewedByID == userId && c.IsSignaled == true && c.DeletedFlag != true),
RecommendationCount = x.Consultation.Count(c => c.DeletedFlag != true && c.ILike == true),
TargetPopulations = x.Access.Select(a => a.Population.PopulationName).ToList(),
AlbumPhotoPaths = x.AlbumPhoto.Where(a => a.DeletedFlag != true).Select(a => a.AlbumElementPath).ToList()
});
正如您所看到的,这里有很多重复的代码。有没有办法将所有常见的投影移动到基础存储库中,只保留特定存储库中的特定投影?
答案 0 :(得分:1)
请考虑以下结构:
public class PublicationRepository
{
string PublicationID;
string Title;
public virtual NewsFeed GetNewsFeed()
{
return new NewsFeed { Id = PublicationID, Title = Title };
}
}
public class PostRepository : PublicationRepository
{
string UserID;
public virtual NewsFeed GetNewsFeed()
{
NewsFeed newsFeed = base.GetNewsFeed();
newsFeed.OwnerIsMyManager = promoManagerIds.Contains(UserID);
return newsFeed;
}
}
public class AlbumRepository : PublicationRepository
{
AlbumPhoto[] AlbumPhoto;
public override NewsFeed GetNewsFeed()
{
NewsFeed newsFeed = base.GetNewsFeed();
newsFeed.AlbumPhotoPath = AlbumPhoto.Where(...);
return newsFeed;
}
}
然后:
return queryBase.Select(x => x.GetNewsFeed());