【问题标题】:Show Day of the week numeric value in Grid row for whole week在整周的网格行中显示星期几数值
【发布时间】:2011-09-14 15:19:18
【问题描述】:

我有一个标准化表格,其中显示了不同供应品的供应交付天数。该表按照良好的数据库实践进行了标准化,并将星期几显示为数值(1、2、3 等)。我正在使用实体框架和 Telerik 网格,需要在网格上显示工作日,显示一周中的每一天以及当天可以交付的最小/最大单位数。此表(供应交付)链接到产品表。我在下面的网格中显示了表格设计和所需的格式。

我不确定如何在网格中显示这些数据。有人告诉我可以使用 Presentation 模型来显示这个?我没有任何关于如何做到这一点的例子。如果有人可以向我展示一个代码示例,最好是关于使用 Entity Framework 和 C# 执行此操作的最佳方法是什么,那么它可以花费一天的时间并知道在网格中绑定的位置会很棒。提前谢谢了!

表格:产品

product_id  (PK, INT, not null)      
ProductName (varchar(150), not null) 
Cost (decimal(18,2), not null)   

表格:SupplyDeliveries

schedule_id (PK, INT, not null)    
product_id (FK, INT, not null)     
DayOfTheWeek (smallint, not null)  //(Day of the week stored in number for ex 1,2,3 )   
MinNo (int, not null)         
MaxNo (int, not null)

*注意:因此,如果我想在表 SupplyDeliveries 中显示纸张交付时间表,那么该记录将是什么样子 product_id = 1(纸张)、DayofWeek = 1(星期一)、MinNo=4、MaxNo=5

所以在网格中,您将看到 Dayoftheweek = 1(星期一)的最小/最大单位(4/5)我可以收到并且 product_id=1(纸)、DayOftheWeek = 2(星期二)的另一条记录显示我可以得到的最小/最大单位..每周每一天的每种产品都会有一个单独的记录......希望有所帮助

这就是我想在网格中显示的内容:

Product Name Cost   Mon  Tue  Wed  Thu  Fri  Sat  Sun

Paper          $5   4/5  4/5                            
Stationery    $20   4/5       8/10      8/10
Printers     $100   4/5       5/6  5/6

【问题讨论】:

  • 成本(5 美元、20 美元、100 美元)从何而来?日期(4/5、5/6、8/10)来自哪里?
  • 对不起,我修改了列(产品表中的成本和 Supply Deleveries 表中的 productid)。我正在尝试使其类似于我的工作示例,我很抱歉造成混淆...请查看 *注意我解释了该产品每天的最小/最大值是如何显示在网格中的

标签: c# entity-framework telerik telerik-grid


【解决方案1】:

首先,关于您的模型,为什么您的 Products 表中有一个 schedule_id 列?您将产品和计划之间的关系存储在 SupplyDeliveries 表中,因此您的 Products 表中的 schedule_id 列似乎是不必要的。

您尝试执行的操作称为枢轴。您将数据建模为行并将其显示为列。据我所知,在 LINQ 中没有明确的表达枢轴的机制。

您可以在这里采取几种方法:

  1. 您可以在数据库中创建一个视图,该视图可以旋转数据并按照您在结果中显示的方式表达它。使用 EF 查询视图并在网格中显示结果。显示应该很容易,因为 EF 实现的实体正是您要显示的内容。

  2. 您可以使用 EF 和查询分组表达式来执行数据透视。这可能不会像在数据库中的视图中执行枢轴一样快,但应该会实现相同的结果。请参阅下面的示例。

  3. 您还可以更改您的数据库模型,使其已经是基于列的。关于现有模型需要注意的一点是,如果 SupplyDeliveries(product_id, DayOfTheWeek) 上没有第二个唯一索引,则同一产品可能有多个“星期一”记录。也许没关系...但是,如果您一开始就不想这样做,您可以考虑为您的数据考虑的另一个模型是具有列:(product_id, mon_min, mon_max, tue_min, ...)。这完全消除了枢轴。

这是#2 的示例:

from s in SupplyDeliveries
group s by s.product_id into g
select new 
{
    ProductId = g.Key, 
    MondayMin = (from x in g where x.DayOfTheWeek == 1 select x.MinNo).FirstOrDefault(),
    MondayMax = (from x in g where x.DayOfTheWeek == 1 select x.MaxNo).FirstOrDefault(),
    TuesdayMin = ...
}

编辑:

回顾一下,方法 #1 让您在 SQL 中构建一个数据透视查询并将其作为视图公开给 EF,而方法 #2 在 EF 中作为基础表上的 LINQ 表达式进行。 #1 的优势(取决于您的底层数据库)是您可以利用 PIVOT 等 SQL 运算符并在数据到达应用程序层之前更有效地转换您的数据。 #2 的优点是您可以将这种转换保留在应用程序层中,这可能对您来说更容易维护,特别是如果您的数据库到目前为止只是表。

关于#3,它只是一个建议和代表你可以做什么。我不知道您的模型和应用程序的详细信息,因此很难提出完整的建议。但是,在这种情况下,我不会担心数据稀疏 - 涉及的列相对较少,特别是如果每​​个产品每个工作日只有一个最小值/最大值。从空间效率的角度来看,不包括 product_id,列方法中有 56 个字节,行方法中有 14 个字节(在行方法中,您还必须存储星期几和单独的 schedule_id 列)。因此,如果您为每种产品平均指定一周中的 4 天,您就可以收支平衡。这不包括在行方法中进行适当索引所需的额外空间。此外,在行方法中,由于额外的连接和过滤,您的查询总是会更复杂(即更慢)。

【讨论】:

  • 感谢您的回复 Michael,我从 Products 表中取出了 schedule_id 字段。关于你提到的方法。您能否详细说明我可以看到方法#1 和#2 适用。对于最初的方法#3,我不想为每一天(周一、周二、周三)创建多个列,因为每个产品都没有空值。我认为方法 #3 同样会让我为 mon_min、mon_max、tue_min、tue_max 创建列,这同样可能不是最有效的表格设计。
  • 您能否详细说明您将如何处理方法#1?我是实体框架的新手,所以仍在尝试掌握它。我是否必须创建一个类(DataTypeObject),将 productId 和一周中的每一天作为类中的属性,并可能创建一个 Ienumerable 列表以绑定到网格?用户应该能够在网格上编辑和更改产品名称。使用我提到的 DTO 对象是否也允许我像这样编辑和更新表格?
  • 如何支持网格内的编辑取决于网格与数据的绑定方式。方法 #1 和 #2 将让您将网格绑定到 EF 不跟踪的对象集合,因此您将负责响应来自网格的事件并更新适当的 EF 实体。对于方法 #3,您可以将网格直接绑定到 EF 实体(尽管这可能不理想),并且 Telerik 网格可以直接进行更新。
【解决方案2】:

感谢您的帮助 Michael,您的建议让我朝着正确的方向思考,我最终制作了一个数据透视表并使用 DTO 类绑定到结果。我能够以我想要的方式获得所有值。我希望这对其他人也有帮助 我查看了以下用于创建数据透视表的示例

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=110576

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2014-10-14
    • 1970-01-01
    • 2012-11-08
    • 2020-10-23
    相关资源
    最近更新 更多