【问题标题】:Timesheets: Retrieve data using SQL, LINQ or class?时间表:使用 SQL、LINQ 或类检索数据?
【发布时间】:2008-12-05 07:36:01
【问题描述】:

我的问题是我想要一个网格,其中填充了一组花费在任务上的时间。它需要在顶部有星期几(这些最好是固定的 - 即太阳,星期一......星期六)和左列下方的任务名称。网格的内容将包含当天在该任务上花费的各个小时。

实现这一目标的最佳方法是什么?选项一是尝试将其全部放入数据库中的 SQL 语句中。选项二是 LINQ 查询的集合,它们从 Tasks 和 TimeEntries 中提取原始数据并正确构建它。选项三是使用 LINQ 并将结果拉入一个类(或集合)中,然后将其绑定到控件(可能是 gridview)。

你会怎么做?

【问题讨论】:

    标签: c# asp.net sql-server linq design-patterns


    【解决方案1】:

    我会在不知道您的结构的情况下对其进行粗略的修改,但我会猜测您有一个任务表和一个任务时间表,其中存储了每个任务的实际时间和日期。这未经测试,但是:

    select t.taskname, sum(case when datepart(d,tt.taskdate)= 1, tt.taskhours) else 0 end) as Sunday, 总和(当 datepart(d,tt.taskdate)= 2, t.taskhours) else 0 end) as Monday 从任务表 t 在 t.taskid = tt.taskid 上加入 tasktime tt 其中 tt.taskdate >= @begindate 和 tt.taskdate

    where 子句很重要,因为您可能只想在网格上一次显示一周(通常是当前周)。这还假设您已正确存储作为日期时间数据类型收费的小时的日期。 (如果您现在还没有解决这个问题 - 您稍后会感谢我的。)变量将以某种方式从用户界面提交。我个人会这样做作为存储过程。我把周二到周六留给你做。

    【讨论】:

    • 这绝对是正确的树。我今天会对此有所了解,看看我的进展如何。无论如何都支持帮助,谢谢。
    • 这不是我所追求的,但结构对我来说是一个很好的入门指南。案例陈述主要是我正在寻找的内容,一旦我弄清楚如何正确汇总结果,我想我会破解它。感谢您的指导!
    【解决方案2】:

    您似乎暗示数据当前驻留在数据库中。最优方案取决于内部数据处理量和项目现有基础设施。

    我会使用大型 SQL 查询将所有数据拉到一起并将ResultSet 直接绑定到网格(几乎没有处理或基础设施),或者使用 LINQ 填充一种TimeSheetModel 类,使用现有的基础设施并支持进一步处理。

    【讨论】:

    • 我喜欢将尽可能多的数据处理留在数据库手中的想法。但我对查询的结构感到很困惑。有 DBA 吗?
    【解决方案3】:

    您可以使用 LinqToSql 将行提取到内存中,然后使用 LinqToObjects 将这些行聚合到您的表格格式中(这是一种旋转聚合)。

    这篇文章展示了一个 linq 数据透视查询。在您的情况下,它会很好地工作,因为您知道要在设计时生成的列。 SQL command to LINQ (pivoting)

    我建议使用 0 个匿名类。应该(至少)有一个类代表数据库中的一行,还有一个类代表网格中一行的值。


    因为我可以在这里说任何我想说的话,所以我想评论一下 HLGEM 的 SUM(CASE) 技术。我以前在我必须用 SQL 编写的报告中使用过它。它工作得很好……如果你想用 SQL 编写的话。

    【讨论】:

    • 嘎!这么多正确和有用的答案。 LINQ 是我的首选,虽然我使用 SQL 也没有问题。我现在已经让 Stored Proc 完全工作,因此应该为转换为 LINQ 提供良好的基础。一旦我得到结果,我会再次发布。感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多