2017-04-13 83 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