Потоковая передача и BLOB-объекты Linq

У меня есть объект, который я использую для хранения метаданных документа в таблице. Основной текст документа может быть очень большим, иногда > 2 ГБ, поэтому я буду хранить его в поле nvarchar(max) в SQL 2008. Позже я буду использовать SQL 2008 для индексации этого поля. Я не буду использовать файловые потоки, потому что они очень ограничивают базу данных и предотвращают определенные типы схем блокировки параллелизма.

Этот объект предоставляется разработчику через LinqToSQL. Меня беспокоит то, что поле будет слишком большим, и я видел, как .Net выдает исключение OutOfMemory, если текст > 1,5 ГБ.

Итак, мне интересно, могу ли я рассматривать этот блоб как поток с помощью Linq? Или мне нужно вообще обойти Linq, если я хочу использовать большой двоичный объект?


person Jiyosub    schedule 14.11.2008    source источник


Ответы (2)


Учитывая ответ на "Может ли запрос LINQ получить BLOB [ ...]" Я подозреваю, что вам не повезло. System.Data.Linq.Binary type не имеет никакого механизма для потоковой передачи — в основном это просто неизменяемое представление массива байтов.

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

Возможно, Entity Framework справится с этим - я этого не исследовал.

person Jon Skeet    schedule 14.11.2008
comment
Спасибо за ответ. Я подумал, может быть, я мог бы добавить новое свойство для работы с полем BLOB-объектов и расширить разделяемый класс для потоковой передачи двоичных данных в базу данных отдельно от Linq. Тогда разработчик, использующий класс, не сможет заметить разницу. - person Jiyosub; 14.11.2008
comment
Я подозреваю, что это будет не так гладко (я подозреваю, что проекции с использованием свойства не будут работать), но это звучит в основном осуществимо. Вам нужно писать в базу данных из этого приложения или просто читать? Чтение, вероятно, будет намного проще :) - person Jon Skeet; 14.11.2008
comment
В качестве альтернативы запись вне LINQ должна быть приемлемой — просто разработчик не сможет установить свойство в поток и вызвать SubmitChanges, чтобы получить все это там. По крайней мере, не без большой работы с вашей стороны, я подозреваю. - person Jon Skeet; 14.11.2008
comment
На самом деле я покрыл весь слой сущностей своими собственными классами, поэтому я могу использовать Linq, Entity Framework, Hibernate и т. д. без изменения кода, вызывающего мои сущности. Так что, возможно, мне придется создать какой-то интерфейс IStream или что-то еще, что позволит передавать эти атрибуты в БД. - person Jiyosub; 14.11.2008

В итоге я написал свой собственный метод для linqtoSql, используя метод записи, доступный для объектов varchar(max) в SQL. Это позволяет разработчикам группировать вставки в БД для больших типов данных.

person Jiyosub    schedule 08.12.2008
comment
Можете ли вы дать более подробную информацию о вашем решении, я застрял с той же проблемой? - person Mart; 23.12.2009