[英]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.