Mam bardzo złożone zapytanie Linq do SQL, które zwraca zestaw wyników z bazy danych Microsoft SQL Server. Zapytanie jest tworzone przy użyciu składni podobnej do:Linq Query zwraca niepoprawny zestaw wyników
Dim db as MyDataContext = MyGetDataContextHelper()
Dim qry = From rslt in db.MyView Select ColumnList
If userParam1 IsNot Nothing Then
qry = qry.Where(lambda for the filter)
End If
etc....
Return qry.ToList()
Istnieje kilka filtrów określone przez użytkownika do zapytania, w tym jeden, który robi się geograficzny szukanie promienia.
Oto problem. Na końcu mam wywołanie "Przerwa" na zestawie "ToList". Kiedy przerwa jest trafiona, używam Linq do SQL Debug Visualizer, aby zobaczyć wygenerowaną instrukcję SQL. Skopiuję tę złożoną instrukcję SQL do okna zapytania programu SQL Server Management Studio i wykonuję ją względem mojej bazy danych, aby uzyskać dokładnie żądany zestaw wyników. Zatem wygenerowany kod SQL wydaje się dawać pożądany wynik. Jednak po uruchomieniu metody "ToList" obiektu zapytania zwrócona lista zawiera mniej wierszy i kilka różnych wierszy. Próbowałem również tego przy użyciu zapisu właściwości dziennika DataContext do pliku, z tym samym wynikiem. Kwerenda generuje poprawny zestaw wyników w SQL Management Studio, ale niepoprawne wyniki z metody ToList.
Jak to możliwe? Jeśli wygenerowany kod SQL jest po prostu przekazywany przez połączenie z serwerem SQL, czy nie powinien generować dokładnie zestawu wyników widzianego w SQL Server Management Studio? Zakładam, że nie rozumiem czegoś z mechanizmu Linq do SQL, to znaczy, że nie jest to tylko przekazywanie do SQL Server. Czy to jest poprawne?
EDIT: Jak na żądanie poniżej, tutaj jest znacznie skrócona wersja SQL, który jest generowany przez Linq, przy czym większość z kolumn wynikowych usuniętymi dla zwięzłości. Wygeneruje poprawny wynik w SQL Management Studio, ale wynik zwracany do mojej aplikacji jest inny.
SELECT [t3].[Id]
FROM (
SELECT DISTINCT [t1].[Id]
FROM (
SELECT [t0].[Id], [t0].[ItemDate]
FROM [dbo].[MySearchView] AS [t0]
) AS [t1]
WHERE (EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[ZipCoverage] AS [t2]
WHERE ([t2].[Id] = [t1].[Id])
AND ([t2].[Latitude] >= (41.09046 - (0.5)))
AND ([t2].[Latitude] <= (41.09046 + (0.5)))
AND ([t2].[Longitude] >= (-73.43106 - (0.5)))
AND ([t2].[Longitude] <= (-73.43106 + (0.5)))
AND (ABS(3956.08833132861 * 2 * ATN2(SQRT(POWER(SIN((((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Latitude]) - 0.717163818159029)/(CONVERT(Float,2))), 2) + (COS(0.717163818159029) * COS((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Latitude]) * POWER(SIN((((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Longitude]) - -1.28161377022951)/(CONVERT(Float,2))), 2))), SQRT((1 - POWER(SIN((((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Latitude]) - 0.717163818159029)/(CONVERT(Float,2))), 2)) + (COS(0.717163818159029) * COS((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Latitude]) * POWER(SIN(((CONVERT(Float,CONVERT(Float,0.0174532925199433))) * [t2].[Longitude])/(CONVERT(Float,2))), 2))))) <= 5)))
AND ([t1].[ItemDate] <= '11/17/2009 8:12:42 PM')
) AS [t3]
UPDATE 2009-11-17 mógł skontaktować MS dotyczące tej kwestii. Utworzono przykładową aplikację, którą przesłałem do ich przedstawiciela ds. Pomocy technicznej. Oni powielił problem i badajĘ .... Odpisze odpowiedź, gdy otrzymam odpowiedź.
AKTUALIZACJA 2009-12-21 Wreszcie otrzymano poprawną odpowiedź z pomocą firmy Microsoft. Zapoznaj się z moją akceptowaną odpowiedzią poniżej, aby uzyskać wyjaśnienie.
Czy możesz wysłać swoje aktualne zapytanie LINQ? Powiedziałeś, że to bardzo skomplikowane. Biorąc pod uwagę, że wszystko inne wydaje się być w porządku, pozostała opcja polega na tym, że zapytanie LINQ zawiera przetwarzanie w trybie runtime, którego tłumacz nie może przekształcić w SQL. – jrista
Odpowiedziałem na twój komentarz dotyczący mojej odpowiedzi poniżej. –
Czy nie ma ORDER BY? Ile wierszy mówimy i jak oceniasz, że wyniki są różne? Czy to możliwe, że zamówienie jest inne i sprawia, że wygląda inaczej? –