Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq对多个表中的多个列表进行排序_C#_Linq_Entity Framework - Fatal编程技术网

C# 使用Linq对多个表中的多个列表进行排序

C# 使用Linq对多个表中的多个列表进行排序,c#,linq,entity-framework,C#,Linq,Entity Framework,目前,我的数据库中有多个表,它们的列略有不同,可以为一个项目定义不同的“历史”元素 所以我有我的项目表 int ItemId {get;set} string Name {get;set} Location Loc {get;set} int Quantity {get;set} 我可以对这些物品做一些事情,比如移动、增加数量、减少数量、预订给客户、“挑选”一件物品,诸如此类的事情。所以我制作了多个“历史表”,因为它们有不同的值要保存,例如 public class MoveHist

目前,我的数据库中有多个表,它们的列略有不同,可以为一个项目定义不同的“历史”元素

所以我有我的项目表

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中提取

我正在使用实体框架、.NET4.5、WPF,并使用Linq进行查询,但无法找到一种方法来获取这些历史元素列表,并根据它们的日期逐个排序

我可以想出一些混乱的方法,比如一个单独的历史记录表,如果需要,可以使用列。或者甚至创建第三个列表,其中包含日期及其来源,然后在该列表中循环,从相应的列表中选择相应的内容。不过,我觉得一定有更好的办法


任何帮助都将不胜感激。

您面临的问题是,您试图将数据库模型用作显示模型,但显然失败了。您需要创建一个表示历史记录网格的新类,然后从各种查询中填充它。根据您的示例输出,显示模型可能是:

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 );

如果您实现这一点是为了提供某种撤销/重做历史记录,那么我认为您的做法是错误的。通常,您会有一个带有相关参数值的
ICommand
对象集合,例如,存储已发生的操作。然后,您将能够针对每个项目分别筛选此集合


如果您没有尝试实现某种撤销/重做历史记录,那么我误解了您的问题,您可以忽略这一点

如果对历史记录项实现
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);

这就是我想要的那种东西。Ryan Amies可能描述了最整洁的解决方案,但这正是我想要的。非常感谢。知道我为什么会得到错误吗?LINQ to Entities无法识别方法“System.String GetDescription()”?我确信这与我添加到历史类中的描述方法有关,实体框架不喜欢它。可能是一个无关的问题,你是对的——在我看来,这很像是ESQL的问题。不幸的是,它的错误信息可能具有相当大的误导性。我能建议的最简单的事情是注释掉
GetDescription()
中的所有行,并用一些无关紧要的内容替换它们,然后恢复它们,直到找到故障点。这就是我上次遇到这类问题时处理ESQL问题的方式。顺便说一下,我将对我的答案进行一个小的编辑,使其更具可读性。但没有实质性的变化。
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);