2013-03-25 18 views
6

Istnieje mnóstwo Q & A na stackoverflow związanych z moim pytaniem, ale nie mogę wydedukować rozumowania problemu i rozwiązania, które działa najlepiej w tym scenariuszu;Nullable Field i SQL Is Null Issue

Więc mam metodę, która pozwala przekazać parentID, a na podstawie rekordów wartości będą filtrowane przy użyciu kwerendy LINQ. Pole w bazie danych zezwala na wartości NULL. Teraz Jeśli porównasz pola przy użyciu operatora == w klauzuli where, wyemitowany sql jest niepoprawny (nie używa IS NULL do porównania), a zatem zapytanie daje 0 wyników. Rozwiązałem to przy użyciu metody Object.Equals(). To zadziałało, ale teraz otrzymuję wyjątek od podania wartości NON NULL, liczby całkowitej, która jest liczbą całkowitą

. Nie można utworzyć stałej wartości typu "System.Object" W tym kontekście obsługiwane są tylko typy pierwotne lub typy wyliczeniowe.

Więc napisałem prostą metodę

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

Odpowiedz

3

Tak problem będzie występować również jeśli jest to SQL. Trzeba obsłużyć NULL jawnie, i to powinno działać:

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

ta zakłada, że ​​chcesz null dopasować. Jeśli chcesz zerowy zwrócić wszystkie wyniki niefiltrowane, zamiast zrobić:

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

miałem problemów z tym nawet czasami, i znaleźć sposób LINQ byłoby tłumaczyć poprawnie przez cały czas było zrobić:

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

Dzieje się tak, ponieważ nawet w SQL, jeśli robisz gdzie ParentID = @ParentID, dopasowanie zerowe nie zwraca żadnych wyników, i musisz użyć ISNULL, aby uniknąć tego do pustego.

+0

Postaram że na jakiś czas i wiem, patrząc na to, że będzie działać. BTW, rozumiem rozumowanie, że otrzymam ten sam problem w SQL, ale myślę, że silnik LINQ będzie emitował odpowiedni SQL na podstawie mojej wartości. Byłem bardziej zdezorientowany o wyjątku, który dostałem podczas korzystania z Object.Equals –

+0

Nie jestem pewien szczególnych cech tego błędu; ten jest dla mnie nowy ... Niestety, EF nie zamierza tworzyć tego rodzaju optymalizacji zapytań SQL. –

1

Aby umożliwić pustych Możesz także spróbować jak to

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

W EF6 można wykorzystać UseCSharpNullComparisonBehavior, aby rozwiązać ten problem. Musisz ustawić opcję kontekstu UseCSharpNullComparisonBehavior na true i będzie zachowywać się jak C#.

objectContext.ContextOptions.UseCSharpNullComparisonBehavior = true; 

można zobaczyć więcej w poniższym linku: http://entityframework.codeplex.com/workitem/145