2013-08-06 41 views
1

目前,我在我的數據庫中有多個表格,其中列略有不同,爲一個項目定義了不同的「歷史」元素。使用Linq從多個表中排列多個列表

所以我有我的物品表;

int ItemId {get;set} 
string Name {get;set} 
Location Loc {get;set}  
int Quantity {get;set} 

我可以做一些事情,這些項目,如移動,增加產品數量,減少數量,書給客戶,「匹克」的項目,這樣的事情。所以我做了多個「歷史表」,因爲他們有不同的價值觀,以節省E.g

public class MoveHistory 
{ 
    public int MoveHistoryId { get; set; } 

    public DateTime Date { get; set; } 

    public Item Item { get; set; } 

    public virtual Location Location1Id { get; set; } 

    public virtual Location Location2Id { get; set; } 
} 

public class PickingHistory 
{ 
    public int PickingHistoryId { get; set; } 

    public DateTime Date { get; set; } 

    public Item Item { get; set; } 

    public int WorksOrderCode { get; set; } 
} 

這是從哪兒我要顯示在列表中顯示的項目一個完整的歷史除了罰款;

項目123被移動於23/02/2013從LOCATION1到LOCATION2

項目123 421

我使用實體框架的工作秩序被挑上24/02/2013, .NET 4.5,WPF以及使用Linq進行查詢,但無法想出一個方法來獲取這些歷史元素列表,並根據它們的日期一一列出。

我可以想到凌亂的方式,就像一個單獨的歷史表,如果需要使用列。甚至可以創建第三個列表,其中包含日期和來自哪個列表,然後在列表中循環選擇相應列表中的相應內容。但是,我覺得必須有更好的方法!

任何幫助,將不勝感激。

回答

1

如果您實現您的歷史記錄項的GetDescription()方法(甚至擴展方法),你可以這樣做:

db.PickingHistory.Where(ph => ph.Item.ItemId == 123) 
    .Select(ph => new { Time = ph.Date, Description = ph.GetDescription() }) 
.Concat(db.MoveHistory.Where(mh => mh.ItemId == 123) 
    .Select(mh => new { Time = mh.Date, Description = mh.GetDescription() }) 
.OrderByDescending(e => e.Time).Select(e => e.Description); 
+0

這事我以後的那種。瑞安艾米斯可能描述了最新的解決方案,但這是我想要的。謝謝! – MichaelMcCabe

+0

任何想法爲什麼我得到錯誤 - LINQ to Entities不能識別方法'System.String GetDescription()'?我確定它與我添加到歷史記錄類中的描述方法有關,而實體框架不喜歡它。可能是一個不相關的問題 – MichaelMcCabe

+0

你是對的 - 它對我來說看起來非常像ESQL的問題。不幸的是,它的錯誤信息可能相當具有誤導性。我可以建議的最簡單的方法是將'GetDescription()'中的所有行註釋掉,然後將它們替換爲一些簡單的內容,然後恢復它們直到找到故障點。最後一次遇到這種情況時,我就是這樣處理ESQL的難題的。 –

1

您面臨的問題是您試圖將數據庫模型用作顯示模型,並且顯然失敗了。您需要創建一個代表歷史記錄網格的新類,然後從各種查詢中填充它。從你的例子輸出的顯示模式可能是:

public class HistoryRow{ 
    public DateTime EventDate { get; set; } 
    public string ItemName { get; set; } 
    public string Action { get; set; } 
    public string Detail { get; set; } 
} 

然後,您可以將數據加載到這個顯示模式:

var historyRows = new List<HistoryRow>(); 

var pickingRows = _db.PickingHistory.Select(ph => new HistoryRow{ 
    EventDate = ph.Date, 
    ItemName = ph.Item.Name, 
    Action = "picked", 
    Detail = "from works order " + ph.WorksOrderCode); 
historyRows.AddRange(pickingRows); 

var movingRows = _db.MoveHistory.Select(mh => new HistoryRow{ 
    EventDate = mh.Date, 
    ItemName = ph.Item.Name, 
    Action = "moved", 
    Detail = "from location " + mh.Location1Id + " to location " + mh.Location2Id); 
historyRows.AddRange(movingRows); 

您可以反覆添加各種表中的行獲得的大名單HistoryRow操作,然後按照您的意願對該列表進行排序並顯示值。

foreach(var historyRow in historyRows) 
{ 
    var rowAsString = historyRow.ItemName + " was " + historyRow.Action.....; 
    Console.WriteLine(rowAsString); 
} 
0

如果你是爲了提供某種撤消/恢復歷史中實現這一點,那麼我認爲你在錯誤的方式去了解它。通常情況下,您將擁有一個帶有相關參數值的ICommand對象集合,例如。您存儲已發生的操作。然後,您可以單獨過濾每個項目的這個集合。

如果你不想實現某種撤消/重做歷史,那麼我誤解了你的問題,你可以忽略它。