Как перейти от нетипизированных наборов данных к POCO \ LINQ2SQL в устаревшем приложении - PullRequest
2 голосов
/ 11 января 2011

Добрый день!

У меня есть устаревшее приложение, в котором слой доступа к данным состоит из классов, где запросы выполняются с использованием SqlConnection / SqlCommand, а результаты передаются на верхние уровни, завернутые в без типизации DataSets / DataTable.

Сейчас я работаю над интеграцией этого приложения в более новое приложение, написанное в ASP.NET MVC 2, где для доступа к данным используется LINQ2SQL.Я не хочу переписывать причудливую логику генерации сложных запросов, которые передаются в SqlConnection / SqlCommand в LINQ2SQL (и у меня нет на это разрешения), но я бы хотел, чтобы результат этих запросов былколлекция строго типизированных объектов вместо нетипизированных DataSets / DataTable.

Основная идея состоит в том, чтобы обернуть старый код доступа к данным в симпатичную модель ASP.NET MVC.

Какой быстрый \ простой способ сделать это?

В дополнение к ответу ниже, вот хорошее решение на основе AutoMapper: http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/

1 Ответ

3 голосов
/ 11 января 2011

Подход, который вы можете использовать, - это использование 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;
}
...