簡體   English   中英

選擇Linq中的子查詢

[英]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子句中,以便可以重新使用它來計算ComComPercent

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

我還通過其他幾種方式調整了您的查詢:

  1. 為了獲得一些輸出,我必須將<更改為<=
  2. 我使用了強制轉換而不是將其重整為兩倍。

這是整個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM