nei*_*ldt 0 c# linq collections lambda
我有以下两个班级;
public class Order
{
public int Id {get;set;}
public List<Item> Items {get;set;}
public DateTime CreatedOn {get;set;}
}
public class Item
{
public int Code {get;set;}
public int SupplierId {get;set;}
public string Name {get;set;}
public decimal Price {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我有一个订单列表,每个订单包含许多不同的项目.我想过滤订单列表,以便我可以实现以下目的;
UPDATE
如何扩展结果以便我只返回具有SupplierId = 1的订单和商品
这是我到目前为止尝试的,现在有效.但是我怎样才能进一步压缩它;
List<Order> OrderList = new List<Order>();
foreach(Order order in Order.Get(1))
{
Order tmpOrder = order;
tmpOrder.Items = order.Items.Where(x => x.SupplierId == 1).ToList();
if (tmpOrder.Items.Count > 0)
OrderList.Add(tmpOrder );
}
Run Code Online (Sandbox Code Playgroud)
返回项目列表中至少有1项具有SupplierId = 1的所有订单
如果没有匹配SupplierId = 1的项目,请不要返回任何订单
IEnuemrable<Order> orders = //...
var supplierOrders = orders.where(o => o.Items.Any(i => i.SupplierId == 1))
.ToList();
Run Code Online (Sandbox Code Playgroud)
似乎很直接.除非您的意思是如果任何订单的supplierId为1,则返回所有订单.
更新1
如何扩展结果以便我只返回具有SupplierId = 1的订单和商品
EF目前(据我所知,直到EF6)不允许您在单个查询中执行此操作.考虑到笛卡尔积问题EF面(有时),它仍然非常容易并且实际上是高效的.
public class MyDbContext : DbContext
{
DbSet<Order> Order { get; set; }
DbSet<Item> Items { get; set; }
|
// each of these orders do not contain any
// items, we did not .Include() them.
var supplierOrders = db.Orders
.Where(o => o.Items
.Any(i => i.SupplierId == 1))
.ToList();
var orderIds = supplierOrders
.Select(so => so.Id)
.ToList();
var supplierItems = db.Items.
.Where(i => orderIds.Contain(i.SupplierId))
.ToList();
Run Code Online (Sandbox Code Playgroud)
因为我们正在使用EF Context,所以只要您在EF中设置了正确的关系(我建议您这样做),它就会自动将联系人在本地缓存的任何项目连接到任何关联项目.
| 归档时间: |
|
| 查看次数: |
4880 次 |
| 最近记录: |