在实体框架中将行转换为列

Posted

技术标签:

【中文标题】在实体框架中将行转换为列【英文标题】:convert rows to column in entity framwork 【发布时间】:2018-12-24 18:18:05 【问题描述】:

如何!?

我有这样的结果:

我想要这个结果:

我的实体代码是这样的:

(from loanPerson in context.LoanPersons.AsParallel()
                  join warranter in context.Warranters.AsParallel() on loanPerson.Id equals warranter.LoanPersonId
                  where loanPerson.Id == 84829
                  select new
                  
                      loanPersonId = loanPerson.Id,
                      waranterId = warranter.WarranterPersonID,
                  ).ToList();

并且行数总是小于 3,我希望有 3 列。

请告诉我你的答案。 坦克。

【问题讨论】:

您能告诉我们您打算如何定义具有可变数量属性的匿名类型吗? @mjwills 变量个数为 3 和 int 查看关于“LINQ + pivot”的许多问题,然后选择一个可以标记为重复的问题。 顺便说一句:您确实必须从查询中删除那些 AsParallel() 调用。与它们的目的相反,它们严重影响性能,因为它们在过滤、连接和投影之前首先将 all 数据从 LoanPersonsWarranters 拉到内存中。通过删除它们,您将获得一个可以立即运行的高效 SQL 查询。 【参考方案1】:

此查询将返回唯一一行,其中waranterIds 将在此特定情况下包含三个WarranterPersonID 值,此字段也是List<int> 类型,因为它的数量在编译时未知:

var answer = (from loanPerson in context.LoanPersons.Where(x => x.Id == 84829)
              join warranter in context.Warranters 
              on loanPerson.Id equals warranter.LoanPersonId
              group warranter by loanPerson.Id into sub
              select new
              
                 loanPersonId = sub.Key,
                 waranterIds = sub.Select(x => x.LoanPersonId).ToList()

                 //if you sure, that quantity equals 3, 
                 //you can write this code instead of waranterIds:
                 //zamen1 = sub.Select(x => x.LoanPersonId).First(),
                 //zamen2 = sub.Select(x => x.LoanPersonId).Skip(1).First(),
                 //zamen3 = sub.Select(x => x.LoanPersonId).Skip(2).First()
              ).ToList();

【讨论】:

以上是关于在实体框架中将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章

在R中将行转换为列

如何在 SQL 中将行转换为列值 [关闭]

如何使用数据透视在 Oracle 中将行转换为列

在实体框架核心中将字典转换为ICollection

在oracle中将行输出转换为列

如何在sql中将行转换为列