Обработка очень больших строк между SQL Server и кодом .NET + LINQ - PullRequest
3 голосов
/ 27 ноября 2008

У меня есть приложение, которое должно обрабатывать очень большие строки между базой данных SQL Server и кодом .NET. У меня есть запрос LINQ, который генерирует строки при сохранении их в базу данных, но при попытке создать строки из базы данных, приложение падает с OutOfMemoryException из-за размера струны.

Нужно ли что-то делать, чтобы сгенерированный LINQ-код избегал этого? Использование какого-либо типа сжатия может быть вариантом, но хотелось бы избежать этого по соображениям производительности.

Ответы [ 2 ]

1 голос
/ 27 ноября 2008

Что вы называете "очень большой"? А что за строка? CLOB? BLOB? XML

Я подозреваю, что вы должны использовать такие вещи, как ExecuteReader(), который (через IDataReader) предоставляет методы для чтения таких столбцов в чанках:

        using (var reader = cmd.ExecuteReader(
            CommandBehavior.SequentialAccess)) {
            char[] buffer = new char[8040]; // or some multiple (sql server page size)
            while (reader.Read()) {
                long dataOffset = 0, read;
                while((read = reader.GetChars(colIndex, dataOffset, buffer, 0, buffer.Length)) > 0) {
                    // process "read"-many chars from "buffer"
                    dataOffset += read;
                }
            }
        }

Очевидно, что с xml может потребоваться XmlReader через cmd.ExecuteXmlReader().

Обновлен комментарий LINQ (теперь удален):

Чтобы использовать IDataReader непосредственно из LINQ-to-SQL, я ожидаю, что самое близкое, что вы можете получить, это ctx.GetCommand(), передав ему запрос. Затем вы должны использовать ExecuteReader или ExecuteXmlReader, как указано выше. Я мало что знаю об EF ...

Если вы приведете пример типа запроса, который не выполняется, могут быть возможны некоторые хитрости - например, если вы фильтруете или выбираете подмножества XML, есть вещи, которые вы можете сделать в SQL / XML - возможно, в UDF, вызываемом через LINQ-to-SQL.

0 голосов
/ 27 ноября 2008

Я не измерял размер строк, но они быстро достигают пределов .Net. Информация XML хранится в объекте XStreamingElement, созданном запросом LINQ. Я дам вашему предложению IDataReader шанс посмотреть, решит ли он проблему. По сути, я читаю обратно с LINQ to SQL, есть ли какой-нибудь хук, чтобы я мог предоставить этот код чата IDataReader?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...