LINQ To Entities : as retourne null, et alors ?
Ce qui suit est très probablement également vrai avec LINQ To SQL.
Je me suis fait avoir comme un bleu sur le forum msdn (voir le thread suivant).
En effet, shlomiw utilise (b as Derived1).Prop_d1 alors que b peut de ne pas être de type Derived1 (et donc (b as Derived1) peut être nul).
Pourtant ça marche !
Pourquoi, c'est très simple, le as, à travers la requête LINQ To Entities, est traduit en SQL.
Prenons les deux cas d'héritage dans EDM:
Soient deux tables TestNull1 et TestNull2:

Prenons le cas du TPT:

La requête SQL générée à partir de la requête LINQ To Entities suivante :
from t in context.TestNull1
select (t as TPTTestNull2).Test2
est :
SELECT
CASE WHEN (CASE WHEN ( NOT (([Project1].[C1] = 1) AND ([Project1].[C1] IS NOT NULL))) THEN '0X' ELSE '0X0X' END LIKE '0X0X%') THEN [Extent1].[Test2] END AS [C1]
FROM [dbo].[TestNull1] AS [Extent1]
LEFT OUTER JOIN (SELECT
[Extent2].[Id] AS [Id],
cast(1 as bit) AS [C1]
FROM [dbo].[TestNull2] AS [Extent2] ) AS [Project1] ON [Extent1].[Id] = [Project1].[Id]
Dans le cas du TPH :

La requête SQL générée à partir de la requête LINQ To Entities suivante :
from t in context.TestNull1
select (t as TPHDerived).Test2
est :
SELECT
CASE WHEN (CASE WHEN ((CASE WHEN ([Extent1].[Dicriminator] IS NOT NULL) THEN cast(1 as bit) ELSE cast(0 as bit) END) <> cast(1 as bit)) THEN '0X' ELSE '0X0X' END LIKE '0X0X%') THEN [Extent1].[Test2] END AS [C1]
FROM [dbo].[TestNull1] AS [Extent1]
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :