Предоставляйте бинарные ссылки для загрузки, где это необходимо, используя ASP.NET MVC3 Linq to SQL, поддерживая отложенную загрузку. - PullRequest
1 голос
/ 07 июля 2011

Я использую столбец VARBINARY (MAX) для хранения двоичных файлов в таблице SQL Server. Другие столбцы в той же таблице используются для хранения атрибутов файла, таких как описание и отметка времени, указывающая, когда файл был загружен.

Я создал представление в MVC3, в котором перечислены атрибуты и ссылки, которые пользователь может использовать для загрузки двоичного файла. Некоторые записи имеют файл для загрузки, а другие нет.

Сначала представление отображалось очень медленно, потому что Linq to SQL включал двоичный столбец в предложение SELECT. Я изменил свойство Delay Loaded ( Linq to SQL Deferred Loading ) для двоичного столбца в модели домена на значение true, чтобы предотвратить это.

Мне нужно было логическое значение, чтобы сказать, какие записи на самом деле имеют двоичный файл, чтобы ссылка на скачивание появлялась только при наличии файла для загрузки, поэтому я добавил параметр BinaryExists в модель представления.

namespace MyProject.Models.ViewModels
{
    public class DownloadsViewModel
    {
        public int DownloadsID { get; set; }
        public DateTime DateUploaded { get; set; }
        public string Description { get; set; }
        public Boolean BinaryExists { get; set; }

        public DownloadsViewModel()
        {
        }

        public DownloadsViewModel(Downloads dModel)
        {
            this.DownloadsID = dModel.DownloadsID;
            this.DateUploaded = dModel.DateUploaded;
            this.Description = dModel.Description;
            this.BinaryExists = dModel.Binary != null;
        }
    }
}

Добавление this.BinaryExists = dModel.Binary != null; привело к тому, что Linq to SQL загрузил все двоичные файлы и снова замедлил просмотр.

Я хочу, чтобы Linq to SQL предоставлял логический индикатор без негативного влияния на производительность представления путем загрузки двоичного файла. Это может быть выполнено в T-SQL с помощью следующего запроса.

SELECT
    DownloadsID,
    DateUploaded,
    Description,
    CASE
        WHEN Binary IS NULL THEN
            0
        ELSE
            1
        END AS BinaryExists
FROM Downloads

Оператор CASE предоставляет логический триггер, когда ссылка на скачивание должна быть доступна без фактической необходимости сначала загружать двоичный файл, просто чтобы проверить, существует ли он.

Есть ли способ сделать то же самое в Linq to SQL?

Спасибо!

1 Ответ

2 голосов
/ 07 июля 2011

Основываясь на взаимной обратной связи, вот самое простое решение:

Добавьте новый вычисляемый столбец в базу данных и используйте формулу: (CONVERT([bit],case when [Binary] IS NULL then (0) else (1) end,(0))).Установите значение «Is Persisted: Yes» для эффективности во время запросов.Установите для типа данных столбца значение бит не ноль, чтобы он отображался в логическое значение в ViewModel.Затем вы можете использовать этот столбец, чтобы получить информацию о большем столбце загруженных двоичных данных с отложенной загрузкой.

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