GroupBy 与 Linq 到实体查询
GroupBy with Linq to entities query
我关注类:
public class OrderItem
{
public int Id { get; set; }
public ICollection<NominalRouting> NominalRoutings{ get; set; }
}
public class NominalRouting
{
public int Id { get; set; }
public DateTime PlanedDate {get; set;} //yyyy/mm/dd
public virtual Operation Operation{ get; set; }
}
public class Operation
{
public int Id { get; set; }
public string Code { get; set; }
public virtual AreaSpecification AreaSpecification{ get; set; }
}
public class AreaSpecification
{
public int Id { get; set; }
public string Title { get; set; }
}
我有以下数据:
-----------------------------------------------------------
| OrderItemId | AreaTitle | Operation Code | PlannedDate |
-----------------------------------------------------------
| 1 | Area1 | OP1 | 2016/01/01 |
| 1 | Area1 | OP2 | 2016/01/02 |
| 1 | Area1 | OP3 | 2016/01/03 |
| 1 | Area2 | OP4 | 2016/02/01 |
| 1 | Area2 | OP5 | 2016/02/02 |
| 1 | Area3 | OP6 | 2016/03/01 |
| 1 | Area3 | OP7 | 2016/03/04 |
| 1 | Area3 | OP7 | 2016/03/08 |
-----------------------------------------------------------
我如何首先使用 EF 代码编写一个 linq to entities(方法语法)查询,通过 AreaTitle
到 GroupBy
以上数据并获得以下结果(earlear PlannedDate
在每个AreaTitle
)?:
-----------------------------------------------------------
| OrderItemId | AreaTitle | Operation Code | PlannedDate |
-----------------------------------------------------------
| 1 | Area1 | OP1 | 2016/01/01 |
| 1 | Area2 | OP4 | 2016/02/01 |
| 1 | Area3 | OP6 | 2016/03/01 |
-----------------------------------------------------------
这个怎么样:
var result = myList.GropuBy(x => x.AreaTitle).Select(x =>
{
var first = x.OrderBy(y => y.PlannedDate).First();
return new
{
OrderItemId = first.OrderItemId,
AreaTitle = x.Key,
OperationCode = first.Operation Code,
PlanedDate = first.PlanedDate
}
});
我没有看到任何特别的东西 - 组,对每个组元素进行排序并先取。
查询语法会更简洁,但这里是您想要的方法语法查询:
var query = db.OrderItems
.SelectMany(orderItem => orderItem.NominalRoutings)
.GroupBy(routing => routing.Operation.AreaSpecification.Title)
.Select(g => new
{
AreaTitle = g.Key,
Routing = g.OrderBy(e => e.PlanedDate).FirstOrDefault()
})
.Select(e => new
{
e.Routing.OrderItem.Id,
e.AreaTitle,
e.Routing.Operation.Code,
e.Routing.PlanedDate
});
我关注类:
public class OrderItem
{
public int Id { get; set; }
public ICollection<NominalRouting> NominalRoutings{ get; set; }
}
public class NominalRouting
{
public int Id { get; set; }
public DateTime PlanedDate {get; set;} //yyyy/mm/dd
public virtual Operation Operation{ get; set; }
}
public class Operation
{
public int Id { get; set; }
public string Code { get; set; }
public virtual AreaSpecification AreaSpecification{ get; set; }
}
public class AreaSpecification
{
public int Id { get; set; }
public string Title { get; set; }
}
我有以下数据:
-----------------------------------------------------------
| OrderItemId | AreaTitle | Operation Code | PlannedDate |
-----------------------------------------------------------
| 1 | Area1 | OP1 | 2016/01/01 |
| 1 | Area1 | OP2 | 2016/01/02 |
| 1 | Area1 | OP3 | 2016/01/03 |
| 1 | Area2 | OP4 | 2016/02/01 |
| 1 | Area2 | OP5 | 2016/02/02 |
| 1 | Area3 | OP6 | 2016/03/01 |
| 1 | Area3 | OP7 | 2016/03/04 |
| 1 | Area3 | OP7 | 2016/03/08 |
-----------------------------------------------------------
我如何首先使用 EF 代码编写一个 linq to entities(方法语法)查询,通过 AreaTitle
到 GroupBy
以上数据并获得以下结果(earlear PlannedDate
在每个AreaTitle
)?:
-----------------------------------------------------------
| OrderItemId | AreaTitle | Operation Code | PlannedDate |
-----------------------------------------------------------
| 1 | Area1 | OP1 | 2016/01/01 |
| 1 | Area2 | OP4 | 2016/02/01 |
| 1 | Area3 | OP6 | 2016/03/01 |
-----------------------------------------------------------
这个怎么样:
var result = myList.GropuBy(x => x.AreaTitle).Select(x =>
{
var first = x.OrderBy(y => y.PlannedDate).First();
return new
{
OrderItemId = first.OrderItemId,
AreaTitle = x.Key,
OperationCode = first.Operation Code,
PlanedDate = first.PlanedDate
}
});
我没有看到任何特别的东西 - 组,对每个组元素进行排序并先取。
查询语法会更简洁,但这里是您想要的方法语法查询:
var query = db.OrderItems
.SelectMany(orderItem => orderItem.NominalRoutings)
.GroupBy(routing => routing.Operation.AreaSpecification.Title)
.Select(g => new
{
AreaTitle = g.Key,
Routing = g.OrderBy(e => e.PlanedDate).FirstOrDefault()
})
.Select(e => new
{
e.Routing.OrderItem.Id,
e.AreaTitle,
e.Routing.Operation.Code,
e.Routing.PlanedDate
});