简体   繁体   English

如何在lambda表达式中将其定义为LINQ Select方法中的另一个函数

[英]How to define in the lambda expression as another function in LINQ Select Method

I am creating Azure Mobile app. 我正在创建Azure移动应用程序。 In the api I created following list with Entity Framework 6.1. 在api中,我使用Entity Framework 6.1创建了以下列表。 The problem is that it is too big in the Select methods, 问题在于Select方法中它太大了,

public IHttpActionResult GetAllQABundle(string qAUser_id, int offset = 0, int limit = 20)
    {

        List<QABundleWithCommentDto> qABundleWithCommentDtos = context.QABundles
            .Where(b => b.TeamId == null)
            .OrderByDescending(b => b.UpdatedAt)
            .Skip(offset)
            .Take(limit)
            .Select(b => new QABundleWithCommentDto()
            {
                Id = b.Id,
                TagForFreeFormat = b.TagForFreeFormat,
                MovieUrl = b.Movie.MovieUrl,
                MovieThumbnailUrl = b.Movie.MovieThumbnailUrl,
                MovieStreamUrl = b.Movie.MovieStreamUrl,
                NumberOfViews = b.Movie.NumberOfViews,
                Title = b.Title,
                Description = b.Description,
                QuestionType = b.QuestionType,
                WannaKnowId = b.WannaKnows.Where(w => w.QAUserId == qAUser_id).FirstOrDefault().Id,
                WannaKnowCount = b.WannaKnows.Count,
                QAUserThumbnailUrl = b.QAUser.ThumbnailUrl,
                QAUserId = b.QAUser.Id,
                UserName = b.QAUser.UserName,
                UpdatedAt = b.UpdatedAt,
                GenereDtos = b.Generes.Select(t => new GenereDto() { GenereId = t.Id, GenereName = t.Name }).ToList(),
                CommentDtos = b.Comments.OrderByDescending(c => c.UpdatedAt).Take(20).Select(c => new CommentDto()
                {
                    Id = c.Id,
                    Text = c.Text,
                    MovieUrl = c.Movie.MovieUrl,
                    MovieThumbnailUrl = c.Movie.MovieThumbnailUrl,
                    QAUserId = c.QAUserId,
                    UserName = c.QAUser.UserName,
                    QAUserBelongsTo = c.QAUser.BelongsTo,
                    QAUserThumbnailUrl = c.QAUser.ThumbnailUrl,
                    CommentCreatedAt = c.CreatedAt,
                    Likes = c.Likes.Count,
                    LikeId = c.Likes.Where(x => x.QAUserId == qAUser_id).FirstOrDefault().Id,
                    UpdatedAt = c.UpdatedAt,
                    QABundleId = c.QABundleId
                }).ToList(),
                TeamDto = new TeamDto()
                {
                    Id = b.TeamId,
                    Name = b.Team.Name,
                    FollowedDtos = b.Team.QAUsers.Select(u => new FollowedDto()
                    {
                        Id = u.Id,
                        UserName = u.UserName,
                        ThumbnailUrl = u.ThumbnailUrl,
                    }).ToList()
                },
                BestAnswerDto = new BestAnswerDto() { Id = b.BestAnswerId, CommentId = b.BestAnswer.CommentId }
            })
            .ToList();

        return Json(qABundleWithCommentDtos);
    }

I would like to define following part as another function, but I do not know how I implement that. 我想将以下部分定义为另一个函数,但是我不知道该如何实现。 Does anyone have good idea? 有人有个好主意吗?

b => new QABundleWithCommentDto()
            {
                Id = b.Id,
                TagForFreeFormat = b.TagForFreeFormat,
                MovieUrl = b.Movie.MovieUrl,
                MovieThumbnailUrl = b.Movie.MovieThumbnailUrl,
                MovieStreamUrl = b.Movie.MovieStreamUrl,
                NumberOfViews = b.Movie.NumberOfViews,
                Title = b.Title,
                Description = b.Description,
                QuestionType = b.QuestionType,
                WannaKnowId = b.WannaKnows.Where(w => w.QAUserId == qAUser_id).FirstOrDefault().Id,
                WannaKnowCount = b.WannaKnows.Count,
                QAUserThumbnailUrl = b.QAUser.ThumbnailUrl,
                QAUserId = b.QAUser.Id,
                UserName = b.QAUser.UserName,
                UpdatedAt = b.UpdatedAt,
                GenereDtos = b.Generes.Select(t => new GenereDto() { GenereId = t.Id, GenereName = t.Name }).ToList(),
                CommentDtos = b.Comments.OrderByDescending(c => c.UpdatedAt).Take(20).Select(c => new CommentDto()
                {
                    Id = c.Id,
                    Text = c.Text,
                    MovieUrl = c.Movie.MovieUrl,
                    MovieThumbnailUrl = c.Movie.MovieThumbnailUrl,
                    QAUserId = c.QAUserId,
                    UserName = c.QAUser.UserName,
                    QAUserBelongsTo = c.QAUser.BelongsTo,
                    QAUserThumbnailUrl = c.QAUser.ThumbnailUrl,
                    CommentCreatedAt = c.CreatedAt,
                    Likes = c.Likes.Count,
                    LikeId = c.Likes.Where(x => x.QAUserId == qAUser_id).FirstOrDefault().Id,
                    UpdatedAt = c.UpdatedAt,
                    QABundleId = c.QABundleId
                }).ToList(),
                TeamDto = new TeamDto()
                {
                    Id = b.TeamId,
                    Name = b.Team.Name,
                    FollowedDtos = b.Team.QAUsers.Select(u => new FollowedDto()
                    {
                        Id = u.Id,
                        UserName = u.UserName,
                        ThumbnailUrl = u.ThumbnailUrl,
                    }).ToList()
                },
                BestAnswerDto = new BestAnswerDto() { Id = b.BestAnswerId, CommentId = b.BestAnswer.CommentId }

Its type is Expression<Func<QABudle, QABundleWithCommentDto>> so if you write: 它的类型是Expression<Func<QABudle, QABundleWithCommentDto>>因此,如果您编写:

Expression<Func<QABudle, QABundleWithCommentDto>> selector = b => new
{
//rest of the code
}

now you can use selector like this: .Select(selector) 现在您可以像这样使用选择器: .Select(selector)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM