[英]Subquery in select Linq
我的查询如下
var result = from cr in cumulativeresult
orderby cr.Days
select new
{
Days = cr.Days,
Com = (from cr1 in cumulativeresult
where cr1.Days < cr.Days
group cr1 by 1 into cr1grp
select
new
{
Count = cr1grp.Count() + cr.Com
}),
ComPercent = Math.Round((double.Parse((
from cr1 in cumulativeresult
where cr1.Days < cr.Days
group cr1 by 1 into cr1grp
select cr1grp.Count() + cr.Com).ToString()) / ComCount) * 100, 2)
};
但是Com和ComPercent并不是作为价值来的。 我如何能够检索其中的值? 我检索它们的循环如下
更新资料
foreach (var item in result)
{
dt.Rows.Add(item.Days, item.Com, item.ComPercent);
}
我不想在foreach循环上进行任何处理,我希望linq查询本身中的值。
编译器不知道您的子查询将始终返回一行,因为返回类型仍然是IEnumerable
(或IQueryable
)。 这可以通过使用First()
或Single()
(或相应的..OrDefault()
版本)解决,但是,更常见的是仅使用Count()
而不进行分组,例如:
Com = (from cr1 in cumulativeresult
where cr1.Days < cr.Days
select cr1
).Count() + cr.Com,
您可能还需要考虑将子查询移到let
子句中,以便可以重新使用它来计算Com
和ComPercent
:
var result = from cr in cumulativeresult
let totalCount =
(from cr1 in cumulativeresult
where cr1.Days < cr.Days
select cr1
).Count() + cr.Com
orderby cr.Days
select new
{
Days = cr.Days,
Com = totalCount,
ComPercent = Math.Round((double)totalCount / ComCount * 100, 2)
};
要回答你的问题,你需要选择.First
的是你,而不是LINQ的,知道是一个单一的分组1
。
我还通过其他几种方式调整了您的查询:
<
更改为<=
。 这是整个LinqPad查询:
var cumulativeresult = new[] { new { Days = 0, Com = 0 }, new { Days = 1, Com = 1 } };
var ComCount = cumulativeresult.Count();
var result = from cr in cumulativeresult
orderby cr.Days
select new
{
Days = cr.Days,
Com = (from cr1 in cumulativeresult
where cr1.Days <= cr.Days
group cr1 by 1 into cr1grp
select
new
{
Count = cr1grp.Count() + cr.Com
}
).First().Count,
ComPercent = Math.Round((//double.Parse(
((double)(
from cr1 in cumulativeresult
where cr1.Days <= cr.Days
group cr1 by 1 into cr1grp
select cr1grp.Count() + cr.Com).First())//.ToString())
/ ComCount) * 100, 2
)
};
var dt = new DataTable();
dt.Columns.AddRange(new[] {new DataColumn("Days"),new DataColumn("Com"),new DataColumn("ComPercent") });
foreach (var item in result)
{
dt.Rows.Add(item.Days, item.Com, item.ComPercent);
}
dt.Dump();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.