2009-03-03 57 views
6

Estoy usando .NET entity framework y tengo una entidad que contiene varbinary. ¿Hay alguna manera fácil de obtener el tamaño del varbinary en el código subyacente, ya que se ha recuperado de la base de datos?Entity framework y VARBINARY

Estoy pensando que podría haber alguna forma de obtener el tamaño directamente de la entidad, algo así como entity.Context.Size, ¿o es necesario manejarlo de manera diferente?

Respuesta

17

Un varbinary se traduce en un campo de byte [] en el marco de la entidad, lo que significa que puede comprobar la propiedad longitud de la matriz:

int fieldSize = entity.MyVarBinaryField.Length; 

Según lo mencionado por tster: En un LINQ a Entidades consulta, puede llamar al método DataLength de la clase SqlFunctions, que se traducirá en una llamada a la función DATALENGTH en la instrucción SQL generada. Esto sólo funciona con SQL Server y Entity Framework 4 o posterior:

int? fieldSize = repository.Entity 
    .Select(e => SqlFunctions.DataLength(e.MyVarBinaryField)).Single(); 
+1

Sólo un poco las cabezas para arriba, esto no funciona dentro de una consulta (a partir de EF 4.0). Proporciona el mensaje de error: LINQ to Entities no admite el tipo de nodo de expresión LINQ 'ArrayLength'. –

+0

No estoy seguro si incluso funcionó dentro de una consulta en EF 1. Marcus L. explícitamente preguntó cómo obtener el tamaño del varbinary después de haber sido recuperado de la base de datos, en cuyo caso lo anterior funciona bien. Si solo se necesita el tamaño, y no los datos binarios en sí, recomendaría almacenar el tamaño en un campo separado o ejecutar una consulta separada utilizando la función DATALENGTH, como lo hizo Marcus. En cualquier caso, gracias por el aviso :) – bernhof

+0

Actualicé la respuesta para incluir un ejemplo de recuperación de la longitud de datos en una consulta LINQ a Entidades (EF 4 solamente) – bernhof

0

Lo resolví ejecutando otra consulta, obteniendo el DATALENGTH() de la celda. No es la manera más suave pero funciona.

Todavía estoy interesado en escuchar si alguien puede encontrar una respuesta para esto.

9

Sé que esta pregunta es viejo, pero EF ahora soporta esto mediante el uso SqlFunctions.DataLength()

+0

Lo vi en MSDN pero no estoy seguro de cómo implementarlo. ¿Podría dar un ejemplo? – pseudocoder

+0

No importa, solo estaba buscando en el espacio de nombres incorrecto. Tenga en cuenta que el nombre completo es 'System.Data.Objects.SqlClient.SqlFunctions.DataLength()' – pseudocoder