LINQ GroupBy通过使用AutoMapper进行聚合

用户名

试图使查询工作,但老实说,由于我尝试的所有方法均无效,因此不确定如何进行查询(或什至有可能)。

总共查询6个表:Person,PersonVote,PersonCategory,Category,City和FirstAdminDivision。

PersonVote是用户的用户查看表,其中包含一个名为Vote的列,该列是一个小数,接受1-5的值(5为“最佳”)。FirstAdminDivision将成为加利福尼亚等美国州的代名词。人员表中有一个名为CityId的列,它是City的外键。我认为其他表格大多是不言自明的,因此除非有必要,否则我不会发表评论。

我的目标是创建一个查询,该查询返回“最受欢迎”人员的列表,该列表将基于特定人在PersonVote表上所有投票的平均值。例如,如果某人获得3票,而所有3票均为“ 5”,那么他们将排在列表的第一位。。。。领带会“赢”。

我可以在没有AutoMapper的情况下进行此工作,但是我喜欢AM使用ProjectTo扩展方法进行投影的功能,因为代码非常清晰易读,并且如果可能的话希望使用该方法,但是运气不佳。

这就是我能正常工作的...。所以,基本上,我试图用ProjectTo而不是LINQ的Select方法来查看是否可行。

List<PersonModel> people = db.People
                    .GroupBy(x => x.PersonId)
                    .Select(x => new PersonModel
                    {
                        PersonId = x.FirstOrDefault().PersonId,
                        Name = x.FirstOrDefault().Name,
                        LocationDisplay = x.FirstOrDefault().City.Name + ", " + x.FirstOrDefault().City.FirstAdminDivision.Name,
                        AverageVote = x.FirstOrDefault().PersonVotes.Average(y => y.Vote),
                        Categories = x.FirstOrDefault().PersonCategories.Select(y => new CategoryModel
                        {
                            CategoryId = y.CategoryId,
                            Name = y.Category.Name
                        }).ToList()
                    })
                    .OrderByDescending(x => x.AverageVote)
                    .ToList();
摇滚

通过查看您的代码示例,我试图确定您的模型以建立示例。我仅使用一些属性来实现以显示功能:

public class People
{
    public int PeronId { get; set; }
    public string Name { get; set; }
    public City City { get; set; }
    public IList<PersonVotes> PersonVoes { get; set; }
}

public class PersonVotes
{
    public int Vote { get; set; }
}

public class City
{
    public string Name { get; set; }
}

public class FirstAdminDivision
{
    public string Name { get; set; }
}

public class PersonModel
{
    public int PersonId { get; set; }
    public string Name { get; set; }
    public string LocationDisplay { get; set; }
    public double AverageVote { get; set; }
}

要使用ProjectTo扩展,然后通过静态API初始化AM:

        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<IEnumerable<People>, PersonModel>()
                .ForMember(
                    model => model.LocationDisplay, 
                    conf => conf.MapFrom(p => p.FirstOrDefault().City.Name))
                .ForMember(
                    model => model.AverageVote,
                    conf => conf.MapFrom(p => p.FirstOrDefault().PersonVoes.Average(votes => votes.Vote)));
        });

因此,给出以下对象:

var people = new List<People>()
        {
            new People
            {
                PeronId = 1,
                City = new City
                {
                    Name = "XXXX"
                },
                PersonVoes = new List<PersonVotes>
                {
                    new PersonVotes
                    {
                        Vote = 4
                    },
                    new PersonVotes
                    {
                        Vote = 3
                    }
                }

            }
        };

然后,我将有一个查询:

var result = people
            .GroupBy(p => p.PeronId)
            .Select(peoples => peoples)
            .AsQueryable()
            .ProjectTo<PersonModel>();

我只是在内存对象中使用,因此这就是为什么我转换为IQueryable以在AM中使用ProjectTo扩展方法的原因。

我希望这就是您想要的。干杯,

为LINQ TO ENTITY查询更新:

var result = db.People
    .GroupBy(p => p.PersonId)
    .ProjectTo<PersonModel>(base.ConfigProvider)  // AM requires me to pass Mapping Provider here.
    .OrderByDescending(x => x.AverageVote)
    .ToList();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章