2010-09-10 8 views
6

Estoy tratando de hacer una pequeña consulta LINQ To SQL en una base de datos SQL CE.evaluando un campo booleano frente a un bit en LINQ To SQL query

var result = from item in items 
      where item.IsTrue == true 
      select item; 

El problema es que la propiedad es un campo IsTruebit en la base de datos (bool en el CLR). Cuando va a SQL en CE obtengo SELECT ... WHERE ([t0].IsTrue = 1).. El valor 1 es un número entero para SqlCe y no lo va a convertir de manera predeterminada.

El índice que tengo en esa columna (la columna IsTrue) no se usa. En su lugar, intenta convertir todos los valores de istrue en la base de datos en enteros y los compara con los 1.

¿Cómo puedo obtener LINQ To SQL para generar WHERE ([t0].IsTrue = Cast(1 as bit))...? Necesito de alguna manera forzar el lanzamiento de ese valor a bit, y de ese modo permitir el uso del índice?

me trataron:

  • item.IsTrue == Convert.ToBoolean(1)
  • item.IsTrue == Convert.ToBoolean("true")
  • item.IsTrue == (bool)true)

Con la esperanza de obtener el árbol de expresión para tener un yeso en ella de modo que se convierte en un molde en LINQ Para SQL, pero no puedo encontrar la manera. ¿Algunas ideas?

+0

Sé que es 6 años después, pero Entity Framework está haciendo el casting a poco ahora. Al menos es para mí. –

Respuesta

0

has necesitado dejando de lado la parte == true y simplemente usando

var result = from item in items where item.IsTrue select item;

Alternativamente, usando method syntax:

var result = items.Where(item => item.IsTrue);

+0

Sí, lo intenté también, pero aún así agregué el "= 1" al sql. – obsid

4

que aterrizó en esta página porque tenía el mismo problema.

Encontré que puede solucionar este problema particular mediante el uso de consultas compiladas. Para utilizar el ejemplo:

DataContext context = /* ... */; 

Func <DataContext, IQueryable<ItemType> compiledQuery = null; 

compiledQuery = CompiledQuery.Compile(
    (DataContext ctx) => (from item in Items 
         where item.IsTrue 
         select item) 
); 

var result = compiledQuery(context); 

Si nos fijamos en el SQL esto genera (mediante la conexión de la secuencia de registro en el DataContext) que por alguna razón hace lo correcto en el uso de consultas no compilado no lo hace. Sus índices que tienen bool s en ellos comenzarán a funcionar.