C# SELECTLINQ中的子查询

C# SELECTLINQ中的子查询,c#,asp.net,linq,C#,Asp.net,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 se

我的问题如下

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)
    };

我不想对我的foreach循环进行任何处理,我想要linq查询本身中的值。

要回答您的问题,您需要选择
。首先,您(而不是linq)知道的
是一组
1

我还以其他几种方式调整了您的查询:


  • 为了获得一些输出,我不得不更改
    编译器,因为返回类型仍然是
    IEnumerable
    (或
    IQueryable
    )。这可以通过使用
    First()
    Single()
    (或相应的
    .OrDefault()
    版本)来解决,但是,更常见的是只使用
    Count()
    而不分组,例如:

    Com = (from cr1 in cumulativeresult
           where cr1.Days < cr.Days
           select cr1
          ).Count() + cr.Com,
    

    你所说的“不以数字形式出现”是什么意思?你正在使用toString()我希望输出中的值,当前它以类型出现是的,你没有正确地访问你的输出“我不想在我的foreach循环中进行任何处理”,什么处理?你需要重复你的工作result@Hitesh如前所述,
    Com
    可能包含多个“计数”,您希望它们如何显示在列中??调用.Count()比使用“group”子句然后调用.Single()容易得多。生成的T-SQL语句也更简单。谢谢你的提示!
    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();
    
    Com = (from cr1 in cumulativeresult
           where cr1.Days < cr.Days
           select cr1
          ).Count() + cr.Com,
    
    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)
                 };