2013-03-25 14 views
6

Esistono tonnellate di Q & A su stackoverflow correlate alla mia domanda, ma non è possibile dedurre il ragionamento del problema e la soluzione che funziona meglio in questo scenario;Nullable Field e SQL Is Null Numero

Quindi ho un metodo che consente di passare un parentID e in base al valore i record verranno filtrati utilizzando una query LINQ. Il campo nel database consente valori NULL. Ora Se si confrontano i campi utilizzando l'operatore == nella clausola where, sql emesso è errato (non utilizza IS NULL per il confronto) e quindi i risultati della query 0 risultano. Ho risolto questo problema utilizzando il metodo Object.Equals(). Ha funzionato, ma ora ottengo un'eccezione passando un valore NON NULL, un numero intero

Impossibile creare un valore costante di tipo 'System.Object'. In questo contesto sono supportati solo tipi primitivi o tipi di enumerazione.

così ho scritto un semplice metodo di

using (TestEntities context = new Entities()) 
{ 
    return from c in context.ItemMappings 
      where c.ParentID.Equals(parentID) 
      select new ItemDTO 
      { 
       ItemID = c.Item.ItemID, 
       ItemName = c.Item.ItemName, 
       ItemType = new ItemTypeDTO 
       { 
        TypeID = c.Item.Type.TypeID, 
        TypeName =c.Item.Type.TypeName 
       }; 
} 

risposta

3

Sì il problema sarebbe anche verificare se si tratta di SQL. Bisogna gestire nulla esplicitamente, e questo dovrebbe funzionare:

Where (parentID == null && c.ParentID == null) || (parentID == c.ParentID) 

Questo presuppone che si desidera un nulla da abbinare. Se si vuole nulla per restituire tutti i risultati non filtrati, invece che fare:

Where (parentID == null) || (parentID == c.ParentID) 

Ho avuto problemi con questo, anche a volte, e ho trovato il modo di LINQ sarebbe tradurre correttamente tutto il tempo è stato quello di fare:

Where (parentID == null) || (parentID != null && parentID == c.ParentID) 

Questo perché anche in SQL, se si fa dove ParentID = @ParentID, una corrispondenza nullo non restituisce risultati, e si deve usare ISNULL per farlo passare in bianco.

+0

Cercherò che da un po ', e so, cercando in esso che funzionerà. BTW, capisco il ragionamento che otterrò lo stesso problema in SQL, ma pensavo che il motore LINQ emettesse il giusto SQL in base al mio valore. Sono stato più confuso sull'eccezione che ho ottenuto durante l'utilizzo di Object.Equals –

+0

Non sono sicuro delle particolarità di tale errore; quello è nuovo per me ... Sfortunatamente EF non cerca di fare questo tipo di ottimizzazioni nelle query SQL. –

1

Per consentire annullabile Potete anche provare come non

GSectionID = emp.SectionID ?? Guid.Empty, 
1

In EF6 è possibile utilizzare UseCSharpNullComparisonBehavior per risolvere questo problema. È necessario impostare l'opzione di contesto UseCSharpNullComparisonBehavior su true e si comporterà come C#.

objectContext.ContextOptions.UseCSharpNullComparisonBehavior = true; 

Si può vedere di più nel seguente link: http://entityframework.codeplex.com/workitem/145