编写LINQ查询以透视结果

问题描述

我已经开发了一个df = df.fillna('') print (df) UserID Value1 Name1 Value2 Name2 Value3 \ 0 456,567,67,96 456 Ups_Meter456 567 Ups_Meter567 67 1 67,987 67 DGB_Meter 987 EB_Meter987 2 4321,96,912 4321 EB_Meter 96 DG_Meter96 912 Name3 Value4 Name4 0 DGB_Meter 96 DG_Meter96 1 2 DG_Meter912 查询。现在,我的要求是从中创建数据透视查询。我是LINQ的新手,我不知道该如何进一步。请参阅所附的结果图片

LINQ

涉及的模型类如下:

public JsonResult SchoolNikashaRpt()
        {
            try
            {
                var temp = (from n in db.Nikashas
                           join s in db.Schools on n.SchoolId equals s.SchoolId
                           join k in db.Programs on n.ProgramId equals k.ProgramId
                           orderby n.SchoolId
                           select new RptSchoolsNikashaviewmodel
                           {
                                SCHOOL_NAME = s.SCHOOL_NAME,PROGRAM_NAME = k.PROGRAM_NAME,MAPPED_AMOUNT = n.MAPPED_AMOUNT
                           }).ToList();

                return Json(temp,JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                throw;
            }
        }

enter image description here

解决方法

因此,您有NikashasSchoolsPrograms。存在一对多关系:每个Nikasha都有一个School,也有一个Program,即外键所指的学校和计划。另一方面:每个学校都有零个或多个尼古拉斯(Nikashas),每个计划都有零个或多个尼古拉斯(Nikashas)。

您想要每个Nikasha,它的学校和计划的一些属性以及一些信息。为此,您可以使用Enumerable.Join的重载之一,如果涉及两个以上的表,则使用Enumerab.Select

会更容易

您没有提到它,但是因为我看到单词db,所以在我看来您是从DbContext中获取数据的,所以您的Enumerables是IQueryable<...>。这对答案的影响不大:

IQueryable<Nikasha> nikashas = db.Nikashas
     // only if you don't want all Nikashas:
     .Where(nikasha => ...);
IQueryable<School> schools = ...
IQueryable<Program> programs = ...

var result = nikashas.Select(nikasha => new RptSchoolsNikashaViewModel
{
    // Get the name of the one and only School of this nikasha
    SchoolName = schools
        // Keep only the School that the foreign key refers to:
        .Where(school => school.Id == nikasha.SchoolId)

        // Select the name of the School
        .Select(school => school.SchoolName)

        // and take the first element
        .FirstOrDefault(),// Do something similar with the program name:
    ProgramName = programs.Where(program => program.Id == nikasha.ProgramId)
        .Select(program => program.ProgramName)
        .FirstOrDefault(),MappedAmount = nikasha.MappedAmount,});

换句话说:从每个Nikasha中,新建一个RptSchoolsNikashaViewModel。对于此RptSchoolsNikashaViewModel,请使用Nikasha的MappedAmount。要获取SchoolName,请选择主键值等于Nikasha中的外键的所有Schools。从其余的学校(可能只有一所)中,以学校的名称命名。最后从其余学校名称中提取第一项。对ProgramNames做类似的事情。