2010-09-10 28 views
6

Sto cercando di eseguire una query LINQ semplice per SQL su un database SQL CE.valutazione di un valore booleano rispetto a un campo di bit in LINQ Alla query SQL

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

Il problema è che la proprietà è un campo IsTruebit nel database (bool nel CLR). Quando si passa a SQL in CE, ottengo SELECT ... WHERE ([t0].IsTrue = 1).. Il valore 1 è un numero intero di SqlCe e non lo trasmetterà di default.

L'indice che ho su quella colonna (la colonna IsTrue) non viene utilizzato. Cerca invece di convertire tutti i valori istrue nel database in numeri interi e li confronta con 1.

Come posso ottenere LINQ su SQL per generare WHERE ([t0].IsTrue = Cast(1 as bit))...? Ho bisogno in qualche modo di forzare la trasmissione di quel valore su un bit, e quindi consentire l'uso dell'indice?

ho provato:

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

Sperando di ottenere l'albero di espressione di avere un cast in modo che lo converte in un cast in LINQ To SQL, ma non riesco a trovare un modo. Qualche idea?

+0

So che sono passati 6 anni, ma ora Entity Framework sta facendo il cast. Almeno è per me. –

risposta

0

Hai provato lasciando fuori la parte == true e usando solo

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

In alternativa, utilizzando method syntax:

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

+0

Sì, l'ho provato anche io, ma ha comunque aggiunto "= 1" a sql. – obsid

4

ho atterrato su questa pagina perché ho avuto lo stesso problema.

Ho trovato che è possibile aggirare questo particolare problema utilizzando query compilate. Per usare il tuo esempio:

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); 

Se si guarda alla SQL questo genera (agganciando il flusso di registro nella DataContext) per qualche motivo fa la cosa giusta in cui utilizzando le query non-compilato non lo fa. I tuoi indici che contengono bool s inizieranno a funzionare.

Problemi correlati