2017-04-13 45 views
-1

我有这样的关系,在我的数据库:一个在许多(IQueryable的)许多和搜索(LINQ)

Order => historyStatus => Status 

Order包含HistoryStatus列表,并HistoryStatus包含一个Status

我的使用情况是:搜索所有Order具有确定Status,并获得最新HistoryStatus(根据日期)

我怎样才能做到这在LINQ to实体和IQueryable

这里是实体:

public class Order 
{ 
    public int ID { get; set; } 

    public virtual ICollection<HistoryStatusOrder> HistoriesStatusOrder { get; set; } 
} 

public class HistoryStatusOrder 
{ 
    public int ID { get; set; } 
    public DateTime Date { get; set; } 
    public string StatusOrderCode { get; 
    public int OrderId { get; set; } 

    public virtual StatusOrder StatusOrder { get; set; } 
    public virtual Order Order { get; set; } 
} 

public class StatusOrder : IEntityBase<string> 
{ 
    public string ID { get; set; } 

    public virtual ICollection<HistoryStatusOrder> HistoriesStatusOrder { get; set; } 
} 

这里是我的Search方法:

// do multiple searches 
if (searchOrderVM.OrderNumber != null) 
    queryable = queryable.Where(x => x.OrderNumber.ToString().Contains(searchOrderVM.OrderNumber.ToString())); 

// Next 
if (searchOrderVM.SelectedOrdersStatus != null) 
{ 
    // Need to return queryable = .... 
} 

// Next search... 
.... 

// Finally I do .ToList() to launch the query in database. 

感谢您的帮助:)

+0

您的意思是“为每个订单查找最新的[具有特定状态值的HistoryStatus]”或“查找_latest_ HistoryStatus具有特定状态值的每个订单的历史状态”?另外,哪个属性保存你提到的日期? –

+0

我需要检索IQueryable 所以我需要根据Date和StatusOrderCode找到所有具有最新HistoryStatusOrder的Orders。我添加了缺少的道具。 – Goba

回答

1

这将找到所有Orders其中对于最新HistoryStatusOrderOrder有一个特别的StatusOrderCode

var results = orders.Where (o => o.HistoriesStatusOrder 
    .OrderByDescending (hso => hso.Date) 
    .First().StatusOrderCode == "foobar"); 

(假设每个Order总是有至少一个HistoryStatusOrder

您可以用不同的方式编写这个查询保存IQueryable<Order>

var results = orders 
    .Select (o => new { 
     Order = o, 
     LatestHistoryStatusOrder = o.HistoriesStatusOrder 
      .OrderByDescending (hso => hso.Date) 
      .First() 
    }) 
    .Where (x => x.LatestHistoryStatusOrder.StatusOrderCode == "foobar") 
    .Select (x => x.Order); 

foreach(var order in results) 
{ 
    // Here you can access: 
    // order.ID 
} 

如果你想继续访问LatestHistoryStatusOrder,您可以跳过最后的.Select(x => x.Order)声明:

var results = orders 
    .Select (o => new { 
     Order = o, 
     LatestHistoryStatusOrder = o.HistoriesStatusOrder 
      .OrderByDescending (hso => hso.Date) 
      .First() 
    }) 
    .Where (x => x.LatestHistoryStatusOrder.StatusOrderCode == "foobar"); 

foreach(var item in results) 
{ 
    // Here you can access: 
    // item.Order.ID 
    // item.LatestHistoryStatusOrder 
} 
+0

Thx为您的答案,但那不是我想要的。我需要返回一个IQueryable ,因为我做了多重搜索。我会在第一个问题中解释这个:)。 – Goba

+0

@Goba我已经添加了一个应该保留'IQueryable ' –

+0

的示例谢谢,它可能适用,但我使用ORACLE 11g,现在有这种错误:/“oracle 11.2.0.3.0不支持应用” – Goba