Używam LINQ do SQL (nie Entity Framework), biblioteki System.Data.Linq.DataContext, uderzanie bazy danych SQL Server 2005 i korzystania z .Net Framework 4.LINQ to SQL nie wygeneruje zapytaniu sargable
Tabela dbo.Dogs zawiera kolumnę "Aktywny" typu CHAR (1) NULL. Gdybym pisał prosto SQL kwerenda będzie:
SELECT * FROM dbo.Dogs where Active = 'A';
Zapytanie LINQ to:
from d in myDataContext.Dogs where d.Active == 'A' select d;
SQL, który pobiera generowane z powyższego zapytania LINQ konwertuje aktywnym polu Unicode. Oznacza to, że nie można używać indeksu na kolumnie dbo.Dogs.Active, spowalniając znacznie zapytanie:
SELECT [t0].Name, [t0].Active
FROM [dbo].[Dog] AS [t0]
WHERE UNICODE([t0].[Active]) = @p1
Czy jest coś, co mogę zrobić, aby zatrzymać LINQ do SQL z włożeniem że UNICODE() call (a tym samym utraty korzyść z mojego indeksu na temat psów.Active)? Próbowałem owijania parametrów przy użyciu metody EntityFunctions.AsNonUnicode(), ale to nie pomogło (jest włożona CONVERT(), aby NVARCHAR zamiast UNICODE() w wygenerowanym SQL), np:
...where d.Active.ToString() == EntityFunctions.AsNonUnicode('A'.ToString());
To jest moja osobista opinia, ale opiera się na moim własnym doświadczeniu - nie używaj Linq2SQL, produkuje straszne Instrukcje SQL, a bardziej złożone zapytania Linq rosną - mniej optymalne instrukcje SQL są wydawane. Nie jestem pewien co do innych ORM-ów, ale ten jest zły. –
Aye. Powinienem dodać, że nie używam Linq do Sql, ponieważ porównałem różne ORMy i uznałem, że Linq to Sql jest najlepszy. Utrzymuję starszą wersję kodu. –
Chociaż ORM są bardzo nieszczelnymi abstrakcjami, nie zgadzam się ze stwierdzeniami krzyżowymi, aby nigdy z nich nie korzystać. Decyzja zależy w dużej mierze od przypadku użycia. Jest tam wyraźna wartość, a także wyraźne wady. – usr