Pytanie Opcje filtru OData (uchwyt wartości pustych lub pustych)


Używamy opcji zapytania filtru $ w OData, aby uruchamiać filtry, w których wartość filtru jest wysyłana w środowisku wykonawczym.

Jako przykład adres URL OData wygląda następująco:

http://services.odata.org/Northwind/Northwind.svc/Customers? $ filter = CustomerID eq @InCustomerID i Country eq @InCountry

gdzie @InCustomerID i @InCountry są wartościami wejściowymi dla równego filtru.

W czasie wykonywania, gdy użytkownik wprowadzi jakąś wartość dla identyfikatora klienta (np. "ABCD"), zastąpimy @InCustomerID przez "ABCD"

W czasie wykonywania kwerendy będą następujące:

http://services.odata.org/Northwind/Northwind.svc/Customers? $ filter = CustomerID eq 'ABCD' i Country eq 'US'

W powyższym przypadku użytkownik wprowadził następujące wartości: ID klienta => "ABCD" i kraj => "USA"

Moje pytanie dotyczy obsługi wartości pustych w filtrze OData $. Jeśli użytkownik nie wprowadzi żadnej wartości dla identyfikatora klienta, wówczas chcemy wybrać wszystkich klientów z określonego kraju.

W przypadku sql byłoby to coś takiego:

wybierz * od Klientów, w których ((IDklienta = @InCustomerID) lub (@ Klient ma zerowy identyfikator)) i (Kraj = @ Kraj).

Zasadniczo, jak obsługiwać wartości puste lub puste, aby określony predykat w warunku logicznym był zawsze prawdziwy.

Czy filtrowanie OData włącza tę opcję?


18
2018-01-31 01:49


pochodzenie




Odpowiedzi:


Można porównać do wartości null za pomocą operatora równania w następujący sposób:

$filter=CustomerID eq null

W twoim przypadku zapytanie zostanie zdegenerowane do czegoś takiego jak:

$filter=(CustomerID eq null) or (null eq null)

Co powinno zadziałać, ale nie jest zbyt przyjemne. Czy w takim przypadku rozważałeś całkowite usunięcie predykatu?


24
2018-01-31 17:25



Nie zgadzam się na czyste rozwiązanie. Ale jesteśmy ograniczeni, ponieważ filtr jest formowany statycznie, aw czasie działania możemy uzyskać wartości puste dla niektórych danych wejściowych filtra. W takim scenariuszu nie ma żadnej łatwej alternatywy. Trudno byłoby całkowicie usunąć predykat, ponieważ wymagałoby to trochę czasu analizowania adresu URL i usunięcia predykatu pustego - Venki
Czy (null eq null) działa dla ciebie? - Vitek Karas MSFT