Как заставить Linq to SQL преобразовать в производный столбец? - PullRequest
2 голосов
/ 19 мая 2009

У меня есть таблица со столбцом 'Wav', которая имеет тип 'VARBINARY (max)' (для хранения файла wav) и хотела бы иметь возможность проверить, существует ли wav из Linq в SQL.

Моим первым подходом было сделать следующее в Linq:

var result = from row in dc.Table
             select new { NoWav = row.Wav != null };

Проблема с кодом, приведенным выше, заключается в том, что он будет извлекать весь двоичный контент в ОЗУ, и это не очень хорошо (медленно и потребляет память).

Есть идеи, как заставить запрос Linq переводить что-то вроде ниже в SQL?

SELECT (CASE WHEN Wav IS NULL THEN 1 ELSE 0 END) As NoWav FROM [Update]

Ответы [ 4 ]

1 голос
/ 20 мая 2009

Спасибо за все ответы. Все они имеют смысл. Действительно, Linq должен правильно переводить! = Null, но, похоже, это неэффективно: мой код выполнялся очень медленно, поэтому почему-то единственное объяснение состоит в том, что двоичные данные переданы ОЗУ .... но может я и не прав.

Я думаю, что я нашел обходной путь в стеке в любом случае: Создание вычисляемого столбца для даты и времени

Я выполнил следующий запрос к моей таблице:

ALTER TABLE [Table]
ADD WavIsNull AS (CASE WHEN [Wav] IS NULL Then (1) ELSE (0) END)

Теперь я обновлю свой DBML, чтобы отразить этот вычисляемый столбец, и посмотрю, как он работает.

0 голосов
/ 19 мая 2009

А как насчет этого запроса:

var result = from row in dc.Table where row.Wav == null
 select row.PrimaryKey

для списка ключей, где ваше значение равно нулю. Для перечисления нуля / не нуля вы можете сделать это:

var result = from row in db.Table 
             select new 
             { Key = row.Key, NoWav = (row.Wav == null ? true : false) };

Это сгенерирует код SQL, подобный следующему:

SELECT [t0].[WavID] AS [Key], 
    (CASE 
        WHEN [t0].[Wav] IS NULL THEN 1
        ELSE 0
     END) AS [NoWav]
FROM [tblWave] AS [t0]
0 голосов
/ 19 мая 2009

Мне непонятно, ваш код SQL вернет список из 1 и 0 из вашей базы данных. Это то, что вы ищете? Если у вас есть идентификатор для вашей записи, то вы можете просто извлечь эту единственную запись с условием в поле Wav, нулевой возврат будет означать отсутствие wav, т.е.

var result = from row in dc.Table
             where (row.ID == id) && (row.Wav != null)
             select new { row.Wav };
0 голосов
/ 19 мая 2009

Вы уверены, что этот код будет извлекать данные в ОЗУ?

Я провел некоторое тестирование с использованием LINQPad , и сгенерированный SQL был оптимизирован, как вы предлагаете:

from c in Categories
select new
{
    Description = c.Description != null
}

SELECT 
    (CASE 
        WHEN [t0].[description] IS NOT NULL THEN 1
        ELSE 0
     END) AS [Description]
FROM [Category] AS [t0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...