Como fazer Linq to SQL traduzir para uma coluna derivada?

votos
2

Eu tenho uma tabela com uma coluna de 'Wav' que é do tipo 'VARBINARY (max)' (armazenar um arquivo wav) e gostaria de ser capaz de verificar se existe um wav de LINQ to SQL.

Minha primeira abordagem foi a de fazer o seguinte no Linq:

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

O problema com o código acima é que vai recuperá todo o conteúdo binário para RAM, e isso não é bom (lento e memória fome).

Alguma idéia de como ter consulta Linq para traduzir em algo como abaixo no SQL?

SELECT (CASE WHEN Wav IS NULL THEN 1 ELSE 0 END) As NoWav FROM [Update]
Publicado 19/05/2009 em 16:47
fonte usuário
Em outras línguas...                            


4 respostas

votos
1

Obrigado por todas as respostas. Todos eles fazem sentido. Na verdade, Linq deve traduzir a = null corretamente, mas não parecem efetivamente fazê-lo: executar o meu código era muito lento, por isso, de alguma forma, a minha única explicação é que ele tem os dados binários transferidos para o RAM .... mas talvez eu esteja errado.

Acho que encontrei um trabalho em torno de qualquer maneira em outro lugar em stackoverflow: Criar uma coluna calculada em um datetime

Corri a seguinte consulta contra minha mesa;

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

Agora eu vou atualizar meu DBML para refletir essa coluna computadorizada e ver como ele vai.

Respondeu 20/05/2009 em 14:17
fonte usuário

votos
0

Eu não sou claro aqui, o seu código SQL vai retornar uma lista de 1s e 0s do seu banco de dados. É isso que você está procurando? Se você tem um ID para seu registro, em seguida, você poderia apenas recuperar esse registro individual com a condição no campo Wav, return null indicaria nenhum wav, ou seja,

var result = from row in dc.Table
             where (row.ID == id) && (row.Wav != null)
             select new { row.Wav };
Respondeu 19/05/2009 em 17:08
fonte usuário

votos
0

E sobre esta consulta:

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

para uma lista de chaves onde seu valor é nulo. Para obter uma listagem de null / não nulo que você poderia fazer isso:

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

Isso vai gerar o código SQL semelhante a este:

SELECT [t0].[WavID] AS [Key], 
    (CASE 
        WHEN [t0].[Wav] IS NULL THEN 1
        ELSE 0
     END) AS [NoWav]
FROM [tblWave] AS [t0]
Respondeu 19/05/2009 em 17:08
fonte usuário

votos
0

Tem certeza que esse código irá recuperar os dados para a memória RAM?

Eu fiz alguns testes usando LINQPad eo SQL gerado foi otimizado como você sugere:

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]
Respondeu 19/05/2009 em 17:06
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more