在整行中显示网格行中的星期几数值

时间:2011-09-14 15:19:19

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

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

我不确定如何在网格中显示此数据。我被告知我可以使用Presentation模型来显示这个?我没有任何关于如何做到这一点的例子。如果有人可以向我展示一个代码示例,最好是通过实体框架和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)

*注意:因此,如果我想在表FeedDeliveries中显示Paper delivery的时间表,那么product_id = 1(Paper),DayofWeek = 1(星期一),MinNo = 4,MaxNo = 5 < / p>

所以在网格中你会看到Dayoftheweek = 1(星期一)我可以收到的最小/最大单位(4/5)以及product_id = 1(Paper),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

2 个答案:

答案 0 :(得分:0)

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

您要做的事情称为枢轴。您将数据建模为行并将其显示为列。据我所知,在LINQ中没有明确的表达枢轴的机制。

您可以采取以下几种方法:

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

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

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

  4. 以下是#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天,那么您就会收支平衡。这排除了行方法中需要的额外空间以进行适当的索引。此外,在行方法中,由于额外的连接和过滤,您的查询将总是更复杂(即更慢)。

答案 1 :(得分:0)

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

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