【问题标题】:Dynamic assignment of column values in each row每行中列值的动态分配
【发布时间】:2016-05-21 09:11:53
【问题描述】:

在下面的代码中,我手动将每列的值分配给变量。是否有更短的代码可以为我完成此操作,而无需键入每列的名称并手动将它们分配给各个变量?

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,还适用于任何其他条件。

提前致谢。 :)

【问题讨论】:

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


    【解决方案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)来映射它。 (不太确定这段代码是如何工作的,或者你正在使用什么数据库等)要检查一列是否为空,我想:

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

    或类似的东西。

    【讨论】:

    • LINQ to SQL* 是 ORM 吗?如果是这样,你能帮我看看如何使用它吗?
    • ORM 是对象关系映射 (IIRC),用于将对象/类自动映射到 SQL。我不确定“LINQ to SQL”是什么,但我建议将 NHibernate 与 Fluent 结合使用。您可以在 VS 中通过 nuget 安装它(只需搜索 fluentnhibernate 并安装它),这里是他们文档的链接:github.com/jagregory/fluent-nhibernate/wiki/Getting-started
    • 不客气。如果此答案有帮助,请将其标记为答案。
    【解决方案2】:

    您可以使用列索引而不是列名,但我认为这不是您想要做的。使用列名非常适合表架构可能以某种方式发生变化的情况。使用列索引,您需要具有与您正在阅读的任何查询返回的相同顺序。

    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?

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

    【讨论】:

    • 我知道条件运算符表达式,但对列索引学习了新的东西。对于大表来说可能很忙,但这绝对是一个较短的代码。不回答我对列值的动态分配,但这也有很大的帮助.. 谢谢.. :)
    • 我希望每个字段都有更多的循环
    • 据我了解,您使用列名的方法是分配读者列的动态方式。如果您担心代码长度,您可以在其他地方分配映射到每个列名的类变量,但最后,我认为您的原始代码是正确的。不过,这是一次很好的对话。
    • 您的问题得到解答了吗?您应该将其中一个回复标记为答案,或者如果是,请要求更多说明。
    • 不,我的问题没有得到回答,但我想我会继续没有它。
    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多