użyciu LINQ-SQL, zastanawiam się, co jest bardziej idiomatyczne następnego trzech,Czy sprawdzanie wartości null w zapytaniach Linq jest idiomatyczne?
foos.Where(foo => foo.Bar.HasValue && foo.Bar.Value < 42)
foos.Where(foo => foo.Bar.Value < 42)
foos.Where(foo => foo.Bar < 42)
Pierwsza opcja generuje dodatkowe Bar IS NOT NULL
predykat, który prawdopodobnie jest zoptymalizowany w większości systemów DBMS. Jeśli jeden obiekt zapytał zamiast bazy danych, kontrola zerowa byłaby obowiązkowa, ale ponieważ można generować kwerendy generyczne, które mogłyby zawieść w obiektach, ale nie w bazach danych, pierwsza opcja zawsze działałaby, chociaż zarówno kod Linq i SQL jest trochę dłużej niż druga opcja. Trzecia opcja, dostarczona przez Michael Liu, wydaje się najlepsza z obu światów, ale nie zadziała w przypadku foo.Bar
ma bool typu ?: foos.Where(foo => foo.Bar)
(powoduje błąd typu, ponieważ nie jest tutaj dokonywana niejawna konwersja).
Czy należy dążyć do napisania ogólnych zapytań, które się nie zawiedą, jeśli są używane poza kontekstem, dla którego zostały pierwotnie zaprojektowane?
Czy możesz pokazać przykładową implementację _wzmocnionego_ '' '? Mam problem z próbą zrozumienia, jak to będzie wiedzieć, czy jest to 'IQueryable' lub' IEnumerable' – Aducci
@Aducci: Kompilator traktuje wyrażenie lambda jako jedno lub drugie w oparciu o typ kompilacji 'foos'. –
Operator zobaczy tylko 'foo.Bar' i' 42', z których żaden nie jest 'IQueryable' ani' IEnumerable'. Dlaczego miałby znać rodzaj "foos" w czasie kompilacji? – Aducci