将特定值从数据库中放入特定表格单元格中。 (Razor - html)

问题描述:

<table class="prTable"> 
    <tr> 
     <th>Exercise</th> 
     <th>1</th> 
     <th>2</th> 
     <th>3</th> 
     <th>4</th> 
     <th>5</th> 
     <th>6</th> 
     <th>7</th> 
     <th>8</th> 
     <th>9</th> 
     <th>10</th> 
     <th>11</th> 
     <th>12</th> 
    </tr> 

    @for (var i = 1; i <= 3; i++) 
    { 
     <tr class="prTableRow"> 
     @if (i == 1) 
     { 
      <td class="prExerVariNameTD">Squat</td> 
     } 
     else if (i == 2) 
     { 
      <td class="prExerVariNameTD">Benchpress</td> 
     } 
     else 
     { 
      <td class="prExerVariNameTD">Deadlift</td> 
     } 
     @for (var ii = 1; ii <= 12; ii++) 
     { 
      var getPR = "SELECT top 1 kg, rep, date FROM Test WHERE exerVariName LIKE '%Comp%' AND exercise = @0 AND rep = @1 order by kg desc"; 
      db.Execute(getPR, i, ii); 

      foreach (var get in db.Query(getPR, i, ii)) 
      { 
       DateTime Date = get.Date; 
       var finalDate = Date.ToString("MMM d, yyyy"); 
       var weight = get.kg + "kg"; 
       var reps = "x " + get.rep; 

       <td class="prTableCell" title="@finalDate">@weight @reps</td> 
      } 
     } 
     </tr> 

    } 
</table> 

因此,在我的数据库中,我有一堆数据,基于训练,每一行都有一个exerise名称,多个可以有相同的,所有行也有重量数据和重复数量在上面。这样做的目的是检查每个练习名称,并选择练习名称的最高重量,重复1次,然后2次,直到12次。因此,它会显示我为每个练习名称的每次重复所做的最佳结果下面将特定值从数据库中放入特定表格单元格中。 (Razor - html)

enter image description here

但是在画面的表格布局一样,也并不总是对每个重复所有的练习数据在数据库中,因此一些数字犯规表演,你可以在图片中看到,该蹲行1,2,3,5,6,10,12,所以有一些缺失,我希望每个数字都在表头中的每个相应数字下,所以5将位于5以下我想解决这个问题的方法是将0kg放入没有数据的单元中,例如在s上quat row,没有数字4,我想把0kg放在那里,这会推动5个人向前移动一个单元格,并且它会在数字5之下结束,等等,以便他们全部在正确的地方。

因此,对于不在数据库中的所有重复数字,我想把它放在0.这是否有意义?

编辑: 数据库图片

enter image description here

+0

你可以存储db.Query的结果(getPR,我,二)在一个变量,并检查你是否得到12 excercises?从上面提到的代码我认为你的查询是限制记录的数量 –

+0

如果该数字不存在,它不会做任何事情,它只是跳到下一个数字! @NaveenKN –

+0

我可以看到数据如何存储在数据库中?请用数据库图像编辑你的问题,并且通过把我们得到的记录数放在变量中来测试你的问题吗? –

var getPR = "SELECT kg, rep, date FROM Test WHERE exerVariName LIKE '%Comp%' AND exercise = @0 order by kg desc"; 
db.Execute(getPR, i); 
var data = db.Query(getPR, i) 

@for (var ii = 1; ii <= 12; ii++) 
{ 
    var matched = data.SingleOrDefault(x => x.rep == ii); 
    if (matched != null) 
    { 
     DateTime Date = get.Date; 
     var finalDate = Date.ToString("MMM d, yyyy"); 
     var weight = matched.kg + "kg"; 
     var reps = "x " + matched.rep; 

     <td class="prTableCell" title="@finalDate">@weight @reps</td> 
    } 
    else 
    { 
     <td class="prTableCell">0kg</td> 
    } 
} 

您可以执行SQL查询只是一个时间并获得基于运动类型的所有记录。你不需要每次重复查询,它都会更高效。

当在循环中使用Linq找到记录,其中有1个代表。如果不存在这样的记录,则il将返回null,并且您将知道您需要清空td。如果找到记录,则使用其数据填充td

编辑:甚至更多,你可以查询数据库仅仅是一个时间这样

var getPR = "SELECT kg, rep, date, exercise FROM Test WHERE exerVariName LIKE '%Comp%' order by kg desc"; 

,改变Linq这个

var matched = data.SingleOrDefault(x => x.exercise == i && x.rep == ii); 
+0

那么,第一个版本给了我错误,并试图翻译错误,它说'序列包含多个匹配的元素',并且在编辑之后,它给了我'不能使用==类型int和字符串'引用'Linq'! –

+1

'singleordefault'表示在'rep = ii'的列表中有更多的记录。你可以用'FirstOrDefault'来改变它,所以它不会抱怨有更多的记录 –

+0

它说关于将int转换为字符串的哪一行? –