首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当表实体中的多个变量为DBNull时,尽量不获取重复代码

当表实体中的多个变量为DBNull时,尽量不获取重复代码
EN

Stack Overflow用户
提问于 2019-12-09 19:41:22
回答 2查看 67关注 0票数 1

我有从数据库中获取所有订单的代码,但是变量ArriveTimePaymethod在数据库中是可以为空的。如果Paymethod在数据库中返回DBNull,我希望它变成iDeal,当ArriveTime为DBNull时,我希望它变成null。我如何在不得到重复代码的情况下做到这一点。

现在,除了在代码中加入大量的if-statements之外,我想不出其他的方法了……

当前代码(5) =到货时间和(8) = paymethod:

代码语言:javascript
运行
复制
public List<OrderDTO> GetAllOrders()
{
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        string query = "SELECT * FROM [dbo].[Order]";

        using (SqlCommand cmd = new SqlCommand(query, con))
        {
            con.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            List<OrderDTO> orders = new List<OrderDTO>();
            int orderIDindex = 1;

            while (reader.Read())
            {
                if (reader.IsDBNull(5))
                {
                    OrderDTO orderDTO = new OrderDTO
                    {
                        OrderID = Convert.ToInt32(reader["OrderID"]),
                        TotalPrice = Convert.ToInt32(reader["TotalPrice"]),
                        UserID = Convert.ToInt32(reader["UserID"]),
                        OrderDate = Convert.ToDateTime(reader["OrderDate"]),
                        ArriveTime = null,
                        To_Adress = reader["To_Adress"].ToString(),
                        ItemCount = Convert.ToInt32(reader["ItemCount"]),
                        Status = (OrderStatus.Orderstatus)Enum.Parse(typeof(OrderStatus.Orderstatus), reader["Status"].ToString()),
                    };
                    orders.Add(orderDTO);
                }
                else if (reader.IsDBNull(8))
                {
                    OrderDTO orderDTO = new OrderDTO
                    {
                        OrderID = Convert.ToInt32(reader["OrderID"]),
                        TotalPrice = Convert.ToInt32(reader["TotalPrice"]),
                        UserID = Convert.ToInt32(reader["UserID"]),
                        OrderDate = Convert.ToDateTime(reader["OrderDate"]),
                        Paymethod = PayMethod.Paymethod.iDeal,
                        To_Adress = reader["To_Adress"].ToString(),
                        ItemCount = Convert.ToInt32(reader["ItemCount"]),
                        Status = (OrderStatus.Orderstatus)Enum.Parse(typeof(OrderStatus.Orderstatus), reader["Status"].ToString()),
                    };
                    orders.Add(orderDTO);
                }
            }
            return orders;
        }
    }
}
EN

Stack Overflow用户

发布于 2019-12-09 19:48:22

将重复的代码移出条件

代码语言:javascript
运行
复制
//...omitted for brevity

while (reader.Read()) {
    OrderDTO orderDTO = new OrderDTO {
        OrderID = Convert.ToInt32(reader["OrderID"]),
        TotalPrice = Convert.ToInt32(reader["TotalPrice"]),
        UserID = Convert.ToInt32(reader["UserID"]),
        OrderDate = Convert.ToDateTime(reader["OrderDate"]),
        To_Adress = reader["To_Adress"].ToString(),
        ItemCount = Convert.ToInt32(reader["ItemCount"]),
        Status = (OrderStatus.Orderstatus)Enum.Parse(typeof(OrderStatus.Orderstatus), reader["Status"].ToString()),
    };

    if (reader.IsDBNull(5)) orderDTO.ArriveTime = null;        
    if (reader.IsDBNull(8)) orderDTO.Paymethod = PayMethod.Paymethod.iDeal,

    orders.Add(orderDTO);
}

//...omitted for brevity

如果在not DBNull时使用这些值,则检查条件,否则提供适当的值。

代码语言:javascript
运行
复制
OrderDTO orderDTO = new OrderDTO {
    //...omitted for brevity

    ArriveTime = reader.IsDBNull(5) ? null : Convert.ToDateTime(reader[5]),
    Paymethod = reader.IsDBNull(8) ? PayMethod.Paymethod.iDeal : //...parse the value,

    //...omitted for brevity
};
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59248148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档