Wracam do blogowania po dłuższej przerwie (ech, minęło dokładnie dwa lata!).
Jako rasowy programista T-SQL nie byłem entuzjastą Linq2SQL ale postanowiłem się z nim zapoznać bliżej.
Miałem dość archaicznie zbudowaną bazę (nie była mego autorstwa!) i spróbowałem zrobić dość proste zapytanie oparte na złączeniu dwóch tabel.
Przedstawię problem w uproszczeniu nie podając oryginalnych tabel bo by się wydało o jaki system chodzi :)
Tabele są dwie i oto ich definicje:
CREATE TABLE [dbo].[T1](
[Id] [int] NULL,
[Col] [varchar](50) NULL,
[Key] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED
(
[Key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFFOraz druga tabela:
CREATE TABLE [dbo].[T2](
[Id] [int] NULL,
[Col] [nchar](10) NULL,
[Key] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_T2] PRIMARY KEY CLUSTERED
(
[Key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
W aplikacji utworzyłem model w Entity Framework:

Tabele miały następujące dane:
Tabela T1:

Tabela T2:

W LINQ zrobiłem zapytanie łączące te tabel poprzez INNER JOIN.
Złączenie będzie na kolumny null-owalne Id w obu tabelach.
oto fragment programu w C#, który to realizował:

Przy tych danych spodziewałem się dwóch rekordów w wyniku dla id równego 1 i 2.
Uruchomiłem program i otrzymałem wynik:

A co robi tutaj ten rekord podkreślony przez mnie czerwoną ramką? odpowiedź może przynieść jedynie SQL Server Profiler.
Podsłuchując to zapytanie otrzymujemy odpowiedź:

W czerwonej ramce mamy odpowiedź dlaczego otrzymaliśmy taki wynik
OR (([Extent1].[Id] IS NULL) AND ([Extent2].[Id] IS NULL))Ten fragment zapytania musi budzić trwogę u programisty bazy danych. LINQ po prostu traktuje NULL jako wartość! W Lin2Objects może sobie tak robić ale w Linq2SQL nie ma prawa tak postępować. Edgar Frank Codd przewraca się w grobie.
A wracając do tytułu notki, to fani zespołu Pink Floyd wiedzą o co chodzi. Tym, którzy nie znają polecam ostatnie fragmenty tego
utworu.