如何从界面更改变量.System.Linq.IQueryable to class System.Coll

本文关键字:System out Coll class to IQueryable Linq 界面 变量 改变 | 更新日期: 2023-09-27 18:36:32

我有以下代码:

var allWorkorders =
            (from wo in context.WORKORDERs
            join wot in context.WORKORDERTYPEs on wo.wot_oi equals wot.wotyoi
            join pri in context.PRIORITies on wo.prio_oi equals pri.priooi
            join s in context.SITEs on wo.BEparn_oi equals s.siteoi
            where wo.audt_created_dttm.Value.Year >= now.Year - 3 && wo.audt_created_dttm.Value.Year >= 2006
                && wo.audt_created_dttm < timeframe && (s.id == "NM" || s.id == "TH") &&
                (wo.clsdt_date ?? new DateTime(3000, 01, 01)) < DateTime.Now
            group pri by new {s.id, pri.prioid, MonthNum = (wo.clsdt_date ?? new DateTime(3000, 01, 01)).Year * 100 +
                (wo.clsdt_date ?? new DateTime(3000, 01, 01)).Month} into groupItem
            orderby groupItem.Key.MonthNum, groupItem.Key.id
            select new {groupItem.Key.id, groupItem.Key.prioid, groupItem.Key.MonthNum, Unit = groupItem.Count()});
            allWorkorders.GroupBy(x => new { x.id, x.MonthNum }).Select(x => new {x.Key.id, x.Key.MonthNum,
            Denominator = x.Sum(y => y.Unit), Numerator = x.Where(y => SqlMethods.Like(y.prioid, "1%") || 
            SqlMethods.Like(y.prioid, "6%")).Sum(y => y.Unit), Data_Indicator = DATA_INDICATOR,
            Budgeted = budgetedPlannedOutageHrs, Industry_Benchmark = INDUSTRY_BENCHMARK,
            Comments = comments, Executive_Comments = executiveComments, 
            Fleet_Exec_Comments = fleetExecComments}).ToList();

我想创建一个 for 循环:

for (int counter = 0; counter < allWorkorders.Count; counter++)
{
    var item = allWorkorders[counter];
    ......

但是,我收到以下错误:"'<'不能应用于类型'int'和'方法组'的操作数"

因此,即使我将所有工作订单都发送到 ToList(),它也没有被识别为列表。

我做错了什么? 我过去做过这个,最大的区别是在过去的情况下,我的ToList在选择语句的末尾。

如何从界面更改变量.System.Linq.IQueryable<out T> to class System.Coll

它试图使用 LINQ 扩展方法方法Count()而不是List<T>.Count

这样做的原因是您没有将ToList()的结果分配给任何内容。 整个语句基本上被忽略,因为您没有使用返回值

allWorkorders.GroupBy(x => new { x.id, x.MonthNum }).Select(x => new {x.Key.id, x.Key.MonthNum,
Denominator = x.Sum(y => y.Unit), Numerator = x.Where(y => SqlMethods.Like(y.prioid, "1%") || 
SqlMethods.Like(y.prioid, "6%")).Sum(y => y.Unit), Data_Indicator = DATA_INDICATOR,
Budgeted = budgetedPlannedOutageHrs, Industry_Benchmark = INDUSTRY_BENCHMARK,
Comments = comments, Executive_Comments = executiveComments, 
Fleet_Exec_Comments = fleetExecComments}).ToList();

您没有将第二行(带有 ToList())的行)分配给任何内容。 您以"Unit = groupItem.Count()});"结束了所有工作订单的分配:"

删除 ToList() 将使它返回一个列表,但由于您没有将其分配给任何内容,因此它会立即超出范围并丢失它。

ToList() 返回一个结果。你需要类似的东西

var newList = allWorkorders.GroupBy(x => ...).Select(x => ...).ToList();

您可以使用 foreach 循环代替,也可以将 () 添加到 计数, for (int counter = 0; counter < allWorkorders.Count(); counter++) .在这种情况下,Count 不是一个属性,而是一个 Linq 扩展方法,你在 IEnumerable 上调用它,这就是为什么当你只给它.Count一个方法组而不是调用方法组.Count()时,它会抱怨它。

此外,您

在那里有两个单独的语句,并且似乎没有将您正在对其执行.ToList()的部分存储在任何地方。