2011-11-08 16 views
20

Mój DBML udostępnia zestaw rekordów, który ma zerowe pole nvarchar. To nullable nvarchar pole jest reprezentowane jako ciąg w moim kodu C#.String.IsNullOrEmpty w LINQ do zapytania SQL?

Czasami to pole ma wartość null, czasami jest pustym łańcuchem, a czasami ma wartość.

Czy String.IsNullOrEmpty() działa w LINQ To SQL? Na przykład, by następujące prace:

var results = from result in context.Records 
       where String.IsNullOrEmpty(result.Info) == false 
       select result; 
+1

Możesz spróbować, LinqPad jest twoim firendem. (http://www.linqpad.net/) –

+1

duplikat http://stackoverflow.com/questions/1368946/linq-syntax-where-string-value-is-not-null-or-empty – hatchet

Odpowiedz

36

Co ciekawe, za MSDN String.IsNullOrEmpty jest obsługiwana (z racji że nie było ono nieobsługiwane), ale mogę tylko znaleźć skarg na niego not being supported.

Jeśli jednak nie działa nie należy wyraźnie porównać ją z wartością logiczną, zamiast:

var results = from result in context.Records 
      /*XXX broke :(where !String.IsNullOrEmpty(result.Info) */ 
      where !(result.Info == null || result.Info.Equals("")) 
      select result; 
+1

To nie " t pracował dla mnie. Profiler pokazał tylko sprawdzić pusty ciąg, ale nie dla wartości "null". –

17

Nie wiem, czy to działa, ale jestem pewien, że to robi:

where (result.Info ?? "") != "" 

(zalecamy parens, generator zapytanie może się mylić bez nich)

+2

Podoba mi się ten, ale przypuszczam, że podobnie jak 'String.IsNullOrEmpty' nie jest obsługiwany bez dokumentacji, że [operator zerowej koalescji jest obsługiwany bez dokumentacji] (http://msdn.microsoft.com/en-us/library) /bb882653.aspx)! Oy. – user7116

2

to nie jest obsługiwana, ponieważ stara się wykorzystać to skutkuje NotSupportedException wyrzucane z ta wiadomość:

Metoda 'Boolean IsNullOrEmpty (System.String)' nie ma obsługiwanego tłumaczenia do SQL.

Zamiast tego, można użyć tej metody, aby zrobić to samo:

var results = from result in context.Records 
       where result.Info != null && result.Info.Length > 0 
       select result; 

Można również użyć result.Info != String.Empty zamiast sprawdzania długości. Oba podejścia będą działać.