如何解决编写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;
}
}
解决方法
因此,您有Nikashas
,Schools
和Programs
。存在一对多关系:每个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做类似的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。