我有一张标准化表格,显示不同供应品的供应交货日期。该表按照良好的数据库实践进行规范化,并将星期几显示为数值(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
答案 0 :(得分:0)
首先,关于您的模型,为什么您的Products表中有schedule_id列?您正在SupplyDeliveries表中存储产品和计划之间的关系,因此看起来您的Products表中的schedule_id列似乎是不必要的。
您要做的事情称为枢轴。您将数据建模为行并将其显示为列。据我所知,在LINQ中没有明确的表达枢轴的机制。
您可以采取以下几种方法:
您可以在数据库中创建一个视图,用于转动数据并按照您在结果中显示的方式表达数据。使用EF查询视图并在网格中显示结果。显示应该很容易,因为EF实体化的实体将正是您要显示的内容。
您可以对分组表达式使用EF和查询来执行数据透视。这可能不会像在db中的视图中执行pivot那样快,但应该完成相同的结果。请参阅下面的示例。
您还可以更改数据库模型,使其基于列。有关现有模型的一点需要注意的是,如果没有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天,那么您就会收支平衡。这排除了行方法中需要的额外空间以进行适当的索引。此外,在行方法中,由于额外的连接和过滤,您的查询将总是更复杂(即更慢)。
答案 1 :(得分:0)
感谢Michael的帮助,您的建议让我思考正确的方向我最终制作了一个数据透视表并使用DTO类绑定到结果。我能够以我想要的方式获得所有价值。我希望这也有助于其他人,我看了下面的例子来创建数据透视表