在实体框架中将行转换为列
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 数据从 LoanPersons
和 Warranters
拉到内存中。通过删除它们,您将获得一个可以立即运行的高效 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();
【讨论】:
以上是关于在实体框架中将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章