【问题标题】:Unable to perform GroupBy on entity type(IQueryable) in LINQ [closed]无法在 LINQ 中对实体类型(IQueryable)执行 GroupBy [关闭]
【发布时间】:2018-08-17 02:31:05
【问题描述】:

以下代码失败:

Iqueryable<shift> list = null;

list = context.shifts.Where(o => o.create_date == date).GroupBy(m => m.empId).select(
g=>
new{
empId = g.Key,
time = g.Sum(s => s.hours) // need to calculate sum of hours worked in each employee
}
);

导致报如下错误:

Cannot implicitly convert type 'System.Linq.IQueryable' to 'System.Data.Entity.shift'

【问题讨论】:

  • 使用var 而不是IQueryable&lt;shift&gt;。对于匿名类型的实例,您的表达式返回 IEnumerable,而不是 shift 值。对匿名类型的引用必须声明为var
  • 首先,这段代码有大小写问题,会导致编译失败。请发布确切的代码。其次,您选择匿名类型,但随后将其设置为 IQueryable&lt;shift&gt;,这将失败,但出现不同的错误,因此再次发布实际代码。
  • 您发布的错误信息正确。您至少应该确保您向我们提供准确的信息。出于这个原因,我投票结束这个问题。

标签: c# asp.net-mvc linq asp.net-web-api


【解决方案1】:

如果我理解正确,您想根据班次表生成一些组值。

您遇到的问题是 Select 方法正在返回一个新的匿名类型,而您尝试将其分配给 IQueryable&lt;shift&gt;

您可以像 cmets 中提到的那样使用var,或者您可以创建一个新类型并使用它来代替匿名类型,如下所示

public class ShiftGroup
{
    public int EmpId { get; set; }
    public int TotalHours { get; set; }
}


IQueryable<ShiftGroup> result =  context.shifts.Where(o => o.create_date == date).GroupBy(m => m.empId).select(
    g=>
    new ShiftGroup {
        EmpId = g.Key,
        TotalHours = g.Sum(s => s.hours) // need to calculate sum of hours worked in each employee
        }
);

【讨论】:

  • 感谢您的帮助!!现在它运行良好。但是,我还需要选择表中存在的其他属性,例如名称、地址。是否可以执行?
  • 可以,只需要在定义的类中添加属性,在Select方法中赋值即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多