Linq选择特定列在何处有价值

时间:2019-01-02 17:29:36

标签: entity-framework linq

我正在尝试根据指定日期的星期几动态选择表的列。我看到过有关动态选择列的帖子,但没有成功。

我的表在一周中的每一天都有一列,在此列中可以是NULL值或数字(计数),以及我要查询的其他一些列。

+------+------+------+------+------+------+------+
| Mon  | Tue  | Wed  | Thur | Fri  | Sat  | Sun  |
+------+------+------+------+------+------+------+
| NULL | NULL | NULL | 1867 | NULL | NULL | NULL |
+------+------+------+------+------+------+------+

我在Linq中传递的是特定日期(2019年1月17日上午12:00)。基于该日期的星期几(在这种情况下为星期四),我需要查看[Thu]列中是否有一个值,或者它是否为空以及其他一些WHERE条件。最终寻找满足这些条件的行数,并且在“星期几”的特定日期有一个值。在SQL中,我使用了case语句,但是它很丑陋,并且无法很好地转换为Linq。

以下是我的查询,其中没有我需要的WHERE子句。对于此示例,我希望查询返回的值为1.如果日期为2019年1月18日上午12:00,则期望其返回0。

int numOfRecords = biMarketEntities.DistRuleNews
    .Where(x => DMCodeDate.CompanyCode.Contains(x.CompanyCode) &&
    DMCodeDate.DMCode == x.DMCode && 
    DMCodeDate.Date.Date >= x.StartDate && DMCodeDate.Date.Date <= x.EndDate) 
    .Count();

编辑:所附的是我要转换为Linq的SQL查询。我当前的Linq语句在WHERE子句中缺少冗长的CASE语句,这是我想简洁地添加到Linq查询中的附加条件。

SELECT COUNT(*)
FROM [BIMarket].[dbo].[DISTRULENEW]
WHERE [DISTRULENEW].[companycode] IN ('LVT')
    AND [DISTRULENEW].[dmcode] IN ('LVTTMC')
    AND '1/17/2019 12:00:00 AM' BETWEEN [DISTRULENEW].[startdate]
        AND [DISTRULENEW].[enddate]
    AND CASE Datename([DW], '1/17/2019 12:00:00 AM')
        WHEN 'Monday'
            THEN CASE 
                    WHEN [DISTRULENEW].[mon] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[mon]
                    END
        WHEN 'Tuesday'
            THEN CASE 
                    WHEN [DISTRULENEW].[tue] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[tue]
                    END
        WHEN 'Wednesday'
            THEN CASE 
                    WHEN [DISTRULENEW].[wed] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[wed]
                    END
        WHEN 'Thursday'
            THEN CASE 
                    WHEN [DISTRULENEW].[thu] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[thu]
                    END
        WHEN 'Friday'
            THEN CASE 
                    WHEN [DISTRULENEW].[fri] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[fri]
                    END
        WHEN 'Saturday'
            THEN CASE 
                    WHEN [DISTRULENEW].[sat] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[sat]
                    END
        WHEN 'Sunday'
            THEN CASE 
                    WHEN [DISTRULENEW].[sun] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[sun]
                    END
        END IS NOT NULL

1 个答案:

答案 0 :(得分:0)

您没有提供太多细节,但是猜测您想要这样的东西(在您的代码中,您正在检查NULL -我不太清楚它是如何工作的,但是您可以看到如何根据星期几。

<?php
        while ($row = $result->fetch_assoc()) {

              unset($idex, $ExName);
              $idex= $row['idex'];
              $ExName = $row['ExName']; 
              echo '<option value="'.$idex.'">'.$ExName.'</option>';

   }  

  ?>
      <div id="sub">
      <input type="submit" name="Submit1" value="Submit" >   
    </div>
         </select>

         <?php

    if(isset($_POST['Submit1'])){ 
            if ($conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
                } 

        $sql = "INSERT INTO students (Ex1)
        VALUES ('$ExName')";

        if ($conn->query($sql) === TRUE) {
            echo "New record created successfully";
        } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
        }
        }
        $conn->close();
            ?>