不使用ORM的情况下如何使用ASP.NET MVC

10
在我的ASP MVC应用程序中,我使用标准SQL(而不是Linq to SQL或其他ORM)来查询我的数据库。
我想将数据库结果传递给我的视图,并在视图中迭代结果。但我不确定如何做到这一点。每个示例都会传递一些字符串或使用L2S。我想传递像嵌套的哈希表之类的东西,但我所能想到的唯一的方法就是将SqlDataReader对象传递给视图,但这听起来真的很糟糕。
我该如何显示来自标准SQL查询的数据库结果在我的视图中?我真的很想使用Linq或其他ORM,但要求我们不这样做(不要问我为什么,我不明白)。我用VB做这个,我会尽力转换任何C#示例提供的内容。

4
满足一个你“不理解”的要求是不好的,我建议你回去找强制执行这个要求的人并获取解释。 - AnthonyWJones
3
在某些企业中,有架构师来做决策,质疑他们并不总是个好主意。他们做决策,而你则编写代码。 - DOK
2
@DOK:任何值得付费的架构师都更希望程序员能够理解他们的设计。如果在你所处的地方不是这样的话,那么现在是时候更新你的简历了。 - AnthonyWJones
1
AnthonyWJones:我认为DOK是在用反讽的方式说话 ;) - pmarflee
5个回答

12

你可以创建简单的类来传输所需的数据,然后手动从数据读取器中填充一个对象列表到控制器中,然后将其传递给视图 - 例如(这是C#代码,但应该很容易转换)

// open your connection / datareader etc.

List<Customer> customers = new List<Customer>();

while(dataReader.Read())
{
 Customer c = new Customer();
 c.Id = dataReader.GetInt32(0);
 c.Name = dataReader.GetString(1);
 // etc (you might want to use string indexers instead of ints for the get methods)

 customers.Add(c);
}

// close and dispose your datareader / connection etc as usual

return View("List", customers);

3
换句话说,自己编写ORM。 :) - Morph

8

我同意Rashack的观点。这篇文章详细地解释了它。链接文本

简而言之,使用 DataTable 和 DataReader 的方法如下:

private DataTable GetData()
{
    DataTable dt = new DataTable();

    using (SqlConnection connection
             = new SqlConnection("ConnectionString"))
    using (SqlCommand command = new SqlCommand())
    {
        command.Connection = connection;
        command.CommandText = "SELECT * FROM Customers";

        connection.Open();
        using (SqlDataReader reader =
            command.ExecuteReader
                (CommandBehavior.CloseConnection))
        {
            dt.Load(reader);
        }
    }

    return dt;
}

接下来,您可以将DataTable读取到一个实体对象中并传递。

我认为您会发现这比使用Linq或ORM可以获得更好的性能。


8

MVC是关于责任的分离。将SqlDataReaders、DataTables或者其他存在于System.Data命名空间中的类传递给视图不是一个好主意。你需要定义一个模型,它可以连接数据库,并且一个控制器将会把这个模型传递给视图。如果你们公司的政策是不使用ORM,那么经典的WebForms比MVC模式更适合你们的情况。


3
我同意。Mvc强制分离各个层,这是实施它的原因。然而,我已经看到了一些实现中忽略了技术的目的。不幸的是,这是我们所在行业的现实。 - Diago
1
最好让模型去询问业务逻辑与数据库进行交流。模型不应该那么智能化。 - User

5
尝试使用DataTables - DataTable可以从IDataReader中加载数据...(我认为这个方法叫做Load)

4
你可以创建自己的数据传输对象类,并使用ADO.Net代码填充它们的实例。这些DTO类将是简单的POCO风格的类,只包含属性get/set存取器,没有方法。与DataSets/DataTables相比,使用POCO对象可能更可取,因为它们轻量级(没有多余的状态)并且从面向对象的角度更直观易用。

看不出使用自己的DTO与使用ORM有什么区别,如果有一个明智的理由避免现有的ORM技术,比如LINQ(我并不确定是否存在这样的理由),那么这个限制也会适用于自己编写的ORM。 - AnthonyWJones
你所说的LINQ,我理解为你指的是LINQ to SQL(仅指一组语言扩展,可将基于查询的逻辑添加到CLR语言中,而不是ORM)?你没有解释为什么你的要求禁止使用像LINQ to SQL这样的ORM。商业ORM包含用于处理对象关系不匹配的丰富功能集。LINQ to SQL跟踪对象状态的更改,并将使用LINQ组成的查询转换为本机SQL。通过ADO.NET执行查询并从结果中填充和返回DTO只是与返回数据集不同的传输方法。 - pmarflee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接