2013-02-01 9 views
8

Ho una funzione per generare un'espressione da utilizzare in una clausola linq Where.Expression <Func<T,bool>> aggiunge una conversione indesiderata quando viene creata nel metodo generico

public static Expression<Func<T,bool>> GetWhereCondition<T>() where T : IActive 
{ 
    return x => x.Active; 
} 

(si noti l'IActive definisce solo la proprietà 'Attivo')

Ci sono altre funzioni correlate e l'idea è che posso iniettare le condizioni richieste in una classe generica per controllare le regole di business, ecc

il problema è che quando ho eseguito questo, l'espressione restituita contiene il Lamda (visto dal debugger):

x => Convert(x).Active 

che naturalmente è rej ect by linq: 'LINQ to Entities supporta solo il cast di tipi primitivi di Entity Data Model.'

Quindi la mia domanda è ...

Come faccio a impedire questo comportamento. Non c'è bisogno di una conversione e chiaramente non è auspicabile. È persino possibile impedirlo?

risposta

10

Bene, supponendo che questo ha solo bisogno di lavorare con le classi (la conversione è per boxe valore-tipo), è possibile aggiungere un vincolo class:

public static Expression<Func<T, bool>> GetWhereCondition<T>() where T : class, IActive 
{ 
    return x => x.Active; 
} 

. ..e la conversione va via.

+2

ah, interessante; la differenza fondamentale è il passaggio da "vincolato" a "callvirt"; è interessante che questo lo faccia funzionare –

2

Prova questo:

public static Expression<Func<T, bool>> GetWhereCondition<T>() where T : IActive 
{ 
    return x => x.Active; 
} 
+0

Sospetto che sia un errore di copia nel questionario –