如何在遗留应用程序中从无类型DataSet迁移到POCO \ LINQ2SQL

时间:2011-01-11 11:13:17

标签: asp.net-mvc linq-to-sql asp.net-mvc-2 dataset poco

美好的一天!

我是一个遗留应用程序,其中数据访问层包含使用SqlConnection / SqlCommand完成查询的类,并将结果传递给包含在无类型 DataSet / DataTable。

现在我正在努力将这个应用程序集成到更新的应用程序中,在ASP.NET MVC 2中使用LINQ2SQL进行数据访问。我不想重写生成在LINQ2SQL中传递给SqlConnection / SqlCommand的复杂查询的奇特逻辑(并且没有权限这样做),但是我&#39 ; d喜欢将这些查询的结果作为强类型对象集合而不是无类型DataSet / DataTable。

基本思想是将旧的数据访问代码包装在一个漂亮的ASP.NET MVC" Model"。

中。

快速\简单的方法是什么?

此处下面的答案是基于AutoMapper的一个很好的解决方案:http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/

1 个答案:

答案 0 :(得分:3)

您可以采用的方法是使用DataReader并进行传输。因此,对于您要使用的每个对象,在数据传输对象文件夹中定义类(或者您的项目是结构化的),然后在您的数据访问层中有类似于下面的内容。

我们在具有高度规范化数据库的项目中使用了与此类似的东西,但在代码中我们不需要该规范化,因此我们使用过程将数据放入更多可用对象中。如果您还需要能够保存这些对象,则需要将对象转换为数据库命令。

  

快速\简单的做法是什么?   此?

根据类的数量等,这可能不是最快的方法,但它允许您使用与Linq对象非常相似的对象,并且根据所使用的集合类型(IList,IEnumerable等),您将成为能够在这些类型的集合上使用扩展方法。

public IList<NewClass> LoadNewClasses(string abc)
{
    List<NewClass> newClasses = new List<NewClass>();

    using (DbCommand command = /* Get the command */)
    {
        // Add parameters
        command.Parameters["@Abc"].Value = abc;

        // Could also put the DataReader in a  using block
        IDataReader reader = /* Get Data Reader*/;

        while (reader.Read())
        {
            NewClass newClass = new NewClass();
            newClass.Id = (byte)reader["Id"];
            newClass.Name = (string)reader["Name"];

            newClasses.Add(newClass);
        }

        reader.Close();
    }

    return newClasses;
}