C# 在实体框架中使用Join、Group By和Sum

C# 在实体框架中使用Join、Group By和Sum,c#,sql,entity-framework,C#,Sql,Entity Framework,我的模型看起来像: public class ReturnItem { public int returnItemId { get ; set; } public int returnRequestId { get; set; } public int quantity { get; set; } public string item { get; set; } } public class ReturnRequest { public int retu

我的模型看起来像:

public class ReturnItem
{
    public int returnItemId { get ; set; }
    public int returnRequestId { get; set; }
    public int quantity { get; set; }
    public string item { get; set; }
}

public class ReturnRequest
{
    public int returnRequestId { get; set; }
    public string orderNumber  { get; set; }
    public IEnumerable<ReturnItem> returnItems { get; set; }
}
如何将查询转换为实体框架并返回列表?我可以用.Include代替.Join吗

不能使用Include代替Join,因为Include已转换为左外部联接,但此处需要内部联接

但您可以使用导航属性隐式执行连接:

db.ReturnRequests
  .Where(rr => rr.orderNumber == "1XX")
  .SelectMany(rr => rr.returnItems)
  .GroupBy(ri => ri.item)
  .Select(g => new {
      Item = g.Key,
      Quantity = g.Sum(ri => ri.quantity)
  });
不能使用Include代替Join,因为Include已转换为左外部联接,但此处需要内部联接

但您可以使用导航属性隐式执行连接:

db.ReturnRequests
  .Where(rr => rr.orderNumber == "1XX")
  .SelectMany(rr => rr.returnItems)
  .GroupBy(ri => ri.item)
  .Select(g => new {
      Item = g.Key,
      Quantity = g.Sum(ri => ri.quantity)
  });

如何从该查询返回列表?@janinaj您的SQL查询返回了不同的结果。但是您可以选择新的ReturnItem{item=g.Key,quantity=g.Sumi=>i.quantity}而不是匿名对象。转换为列表非常容易,我想您好,我遇到了一个错误,指定的类型成员“returnItems”在LINQ to Entities中不受支持。只支持初始值设定项、实体成员和实体导航属性。@janinaj遗憾的是,无法在实体查询中构造复杂类型。所以您需要从数据库中加载匿名对象,然后使用一个可数调用,然后将匿名对象投影到ReturnItem Type如何从该查询返回列表?@janinaj您的SQL查询返回了不同的结果。但是您可以选择新的ReturnItem{item=g.Key,quantity=g.Sumi=>i.quantity}而不是匿名对象。转换为列表非常容易,我想您好,我遇到了一个错误,指定的类型成员“returnItems”在LINQ to Entities中不受支持。只支持初始值设定项、实体成员和实体导航属性。@janinaj遗憾的是,无法在实体查询中构造复杂类型。所以您需要从数据库中加载匿名对象,然后使用一个可数调用,然后将匿名对象投影到ReturnItem类型
db.ReturnRequests
  .Where(rr => rr.orderNumber == "1XX")
  .SelectMany(rr => rr.returnItems)
  .GroupBy(ri => ri.item)
  .Select(g => new {
      Item = g.Key,
      Quantity = g.Sum(ri => ri.quantity)
  });