动态分配每行中的列值

时间:2016-02-10 20:14:49

标签: c# sql sql-server asp.net-mvc-4 dynamic

在下面的代码中,我手动将每列的值分配给变量。是否有一个更短的代码可以为我做这个而不必键入每个列的名称,并手动将它们分配给各个变量?

while (rdr.Read())
        {
            var book = new BookViewModel();
            book.ship_last_name = rdr["ship_last_name"].ToString();
            book.ship_first_name = rdr["ship_first_name"].ToString();
            book.ship_zip = rdr["ship_zip"].ToString();
            book.ship_state = rdr["ship_state"].ToString();
            book.ship_address = rdr["ship_address"].ToString();
            book.ship_city = rdr["ship_city"].ToString();
            book.day_phone = rdr["day_phone"].ToString();
            book.email_address = rdr["email_address"].ToString();

            model.Add(book);
        }

另外,如果可能的话,我可以在那里添加if语句来检查给定行中的特定列是否为空?不只是为了null,而是任何其他条件。

提前致谢。 :)

2 个答案:

答案 0 :(得分:1)

稍微简短的代码:

while (rdr.Read())
    {
        var book = new BookViewModel {
        ship_last_name = rdr["ship_last_name"].ToString(),
        ship_first_name = rdr["ship_first_name"].ToString(),
        ship_zip = rdr["ship_zip"].ToString(),
        ship_state = rdr["ship_state"].ToString(),
        ship_address = rdr["ship_address"].ToString(),
        ship_city = rdr["ship_city"].ToString(),
        day_phone = rdr["day_phone"].ToString(),
        email_address = rdr["email_address"].ToString() }

        model.Add(book);
    }

另外,我想你可能想用某种ORM(比如NHibernate)来映射它。 (不确定这段代码是如何工作的,或者你正在使用什么DB,等等。)为了检查列是否为空,我想:

if(rdr["column_name"] != null)

或类似的东西。

答案 1 :(得分:0)

您可以使用列索引而不是列名称,但我不认为这是您想要做的。使用列名称非常适用于表模式可能以某种方式更改的情况。使用列索引,您需要具有与正在读取的任何查询一起返回的相同顺序。

while (rdr.Read())
{
    var book = new BookViewModel {
    ship_last_name = rdr.GetString(0),
    ship_first_name = rdr.GetString(1),
    ship_zip = rdr.GetString(2),
    ship_state = rdr.GetString(3),
    ship_address = rdr.GetString(4),
    ship_city = rdr.GetString(5),
    day_phone = rdr.GetString(6),
    email_address = rdr.GetString(7) }

    model.Add(book);
}

以上方法可行,但您可能会遇到转换为字符串或列索引的不同方式的问题。如果您担心某些列上的空数据,可以使用类似上一个回答的内容以及一些dbnull检查。

ship_first_name = rdr.IsDBNull(1) ? "empty" : rdr.GetString(1),
ship_zip = rdr.IsDBNull(2) ? "empty" : rdr.GetString(2),
ship_state = rdr.IsDBNull(3) ? "empty" : rdr.GetString(4),

使用上面的这些条件运算符表达式之一。这是条件运算符表达式的一个很好的细分:Question mark and colon mean in statement? what does it mean?

我不知道这是否能回答你的整个问题。我想这完全取决于你想要如何格式化的东西。像条件运算符表达式这样的工具非常适合不占用一百万行代码的智能逻辑。