1

現時点では、アイテムのさまざまな「履歴」要素を定義するために、データベースに複数のテーブルがあり、列がわずかに異なります。

これでアイテム テーブルができました。

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

これらのアイテムに対して、移動、数量の増加、数量の減少、顧客への予約、アイテムの「選択」などのいくつかのことを実行できます。そのため、たとえば保存する値が異なるため、複数の「履歴テーブル」を作成しました

 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 は 2013 年 2 月 23 日に場所 1 から場所 2 に移動されました

品目 123 は、2013 年 2 月 24 日に作業指示書 421 からピッキングされました

Entity Framework、.NET 4.5、WPF を使用し、Linq を使用してクエリを実行していますが、これらの履歴要素のリストを取得し、日付に基づいて 1 つずつ並べ替える方法がわかりません。

必要に応じて使用される列を持つ単一の履歴テーブルなど、面倒な方法を考えることができます。または、日付とそれがどのリストから来たかを含む 3 番目のリストを作成し、そのリストを循環して、対応するリストから対応するコンテンツを選択します。しかし、私はもっと良い方法があるに違いないと感じています!

どんな助けでも大歓迎です。

4

3 に答える 3

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);
于 2013-08-06T16:22:32.197 に答える
0

何らかの元に戻す/やり直しの履歴を提供するためにこれを実装している場合は、間違った方法で行っていると思います。ICommand通常、パラメータ値が関連付けられたオブジェクトのコレクションが 1 つあります。発生した操作を保存します。その後、このコレクションをアイテムごとに個別にフィルタリングできます。

ある種の元に戻す/やり直しの履歴を実装しようとしていない場合は、質問を誤解しているため、これを無視してかまいません。

于 2013-08-06T16:14:46.833 に答える