【问题标题】:How do I traverse three tables and get the maximum of a value如何遍历三个表并获得最大值
【发布时间】:2012-05-26 20:20:00
【问题描述】:

在我的 EntityFramework 中,我有三个相关联的表,如下所示:

我正在尝试获取文件最后一次用于作业的时间。我有 File.Name 的值,我需要获取 Job.ExecutedOn 的最大值。我可以使用 where 子句获取 File.FileId,然后在单独的表达式中获取 FileHistory.JobId 的列表,最后在第三个表达式中获取 Job.ExecutedOn 的最大值。感觉很笨拙。

我希望有一个表达式接受 File.Name 的值并遍历表以返回 Job.ExecutedOn 的最大值。这可能吗?怎么样?

【问题讨论】:

    标签: c# linq entity-framework lambda entity-framework-4.1


    【解决方案1】:

    这应该可以解决问题

     DateTime GetLastExecutionTime(ObjectContext context, string fileName)
     {
        var query = from file in context.Files
                        join history in context.FileHistories 
                            on file.FileID equals history.FileID
                        join job in context.Jobs 
                            on history.JobID equals job.JobID
                        where file.FileName == fileName
                        select job.ExecutedOn;
    
        var result = query.Max();
     }
    

    【讨论】:

    • 您的查询语法中有一些错误,我更新了答案以更正它们。
    • jeroenh,把它放在一个函数中很不错。谢谢
    • 斯科特,感谢您的帮助。我应该考虑加入。
    • Scott,谢谢你纠正我 - 当我没有被编译器拍打时,这总是发生在我身上:-)
    【解决方案2】:

    我相信这对你有用:

    var query =
        from file in dc.Files
        where file.Name == fileName
        from history in file.FileHistories
        orderby history.Job.ExecutedOn descending
        select history.Job.ExecutedOn;
    var lastExecutedDate = query.First();
    

    我以一种方式编写它,以便您可以轻松地返回相关的工作。为此,只需将最终投影更改为 select history.Job

    否则,您可以删除排序并获取查询的Max()(而不是First())。

    【讨论】:

    • 杰夫,超级手指,很好的触摸来处理连接以访问作业。事实证明,我需要在另一个应用程序中这样做。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2023-01-22
    • 2020-04-02
    相关资源
    最近更新 更多