将特定值放在数据库中的特定表格单元格中。 (剃刀 - html)

Posted

技术标签:

【中文标题】将特定值放在数据库中的特定表格单元格中。 (剃刀 - html)【英文标题】:Put specific values in specific table cells from database. (Razor - html) 【发布时间】:2017-09-16 20:02:12 【问题描述】:
<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>

所以,在我的数据库中,我有一堆数据,基于训练,每一行都有一个运动名称,多行可以有相同的,所有行也有重量数据和重复次数。它的作用是检查每个练习名称并选择对该练习名称所做的最高权重进行 1 次重复,然后选择 2 次,依此类推直到 12 次。所以它会显示我为每个练习名称的每次重复所做的最佳结果在如下图的表格布局中

然而,并非所有练习的每次重复都有数据是数据库,所以有些数字没有显示在图片中,深蹲行为 1,2,3,5,6,10, 12,所以缺少一些,我希望每个数字都在表头中的每个对应数字之下,所以5将位于5之下,依此类推,我想解决这个问题的方法是放入0kg没有数据的单元格,例如在深蹲行上,没有数字 4 的数据,我想在那里放 0kg,这会将 5 向前推一个单元格,它最终会低于数字 5,所以为所有人打开,以便他们都在正确的位置。

所以,对于所有不在数据库中的重复数字,我想输入 0。这是否有意义?

编辑: 数据库图片

【问题讨论】:

您能否将 db.Query(getPR, i, ii) 的结果存储在一个变量中并检查您是否获得了 12 次练习?从上面提到的代码中,我认为您的查询限制了记录数 是的,如果号码不存在,它根本不做任何事情,它只是跳到下一个号码! @NaveenKN 我可以看看数据是如何存储在数据库中的吗?请使用数据库图像编辑您的问题,并且您是否通过将我们获得的记录数放入变量中进行测试? 更新了帖子。我不知道我会怎么做,但表格的图片是这段代码给我的结果,每个单元格都是循环的结果@NaveenKN 【参考方案1】:
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);

【讨论】:

嗯,第一个版本给了我错误,并试图翻译错误,它说类似sequence contains more than one matching element,在你编辑之后给我,cant use == for type int and string 指的是Linq 的东西! singleordefault 表示在rep = ii 的列表中有不止一条记录。你可以用FirstOrDefault改变它,所以它不会抱怨记录更多 哪一行提到了将 int 转换为字符串? var matched = data.SingleOrDefault(x =&gt; x.exercise == i &amp;&amp; x.rep == ii); 从 int 到 string 给出 == 错误 让我们continue this discussion in chat。

以上是关于将特定值放在数据库中的特定表格单元格中。 (剃刀 - html)的主要内容,如果未能解决你的问题,请参考以下文章

通过用户输入和 Javascript 更改特定表格单元格中的文本

表格中如何提取指定单元格的内容呢?

基于多个数据从单元格中添加和删除特定值

Swift:Tableview 中特定单元格中的 addSublayer 不是每个单元格

如何从具有多个数组的字典中获取特定键并存储到放置在表格视图单元格中的字符串中

将带有换行符的值导出到 Excel 中的单个单元格中。 jQuery 数据表