Existe-t-il un moyen de convertir avec précision la requête SQL suivante en LINQ
SELECT * FROM T1 WHERE ColumnA IN ( SELECT FkColumnA FROM T2 WHERE FkColumnB IN ( SELECT ColumnB FROM T3 WHERE FkColumnC IN ( SELECT ColumnC FROM T4 WHERE FkColumnD = 1)) AND FkColumnE is null AND ColumnF = 0)
En outre, quelqu'un sait-il de n'importe quelle documentation dans laquelle n'importe quelle logique ou directive pour convertir des requêtes SQL à LINQ est présentée?
EDIT 1:
L'équivalent pour JOINS ci-dessus serait comme ci-dessous:
select * from T1 a inner join T2 b on a.FKColumnA = b.ColumnA inner join T3 c on c.ColumnB = b.FkColumnB inner join T4 d on d.ColumnC = c.FkColumnC where a.FkColumnD is null and a.ColumnE = 0 and d.ColumnC = 1
et sa requête LINQ équivalente serait
var linq = from q in context.T1 join r in context.T2 on q.FKColumnA equals r.ColumnA join s in context.T3 on r.FkColumnB equals s.ColumnB join t in context.T4 on s.FkColumnC equals t.ColumnC where q.FkColumnD != null && q.ColumnE == false && t.ColumnC == 56816 select q.FkColumnF;
Mais utiliser JOINS semblait être un peu plus simple et mieux dans LINQ . Ainsi, la question est pour mon but de connaissance seulement.
Traduisant votre requête littéralement, nous obtenons l'instruction LINQ suivante:
var results = table1.Where(t1 => table2.Where( t2 => table3.Where( t3 => table4.Where(t4 => t4.FkColumnD == 1) .Select(t4 => t4.ColumnC) .Contains(t3.FkColumnC)) .Select(t3 => t3.ColumnB) .Contains(t2.FkColumnB) && !t2.FkColumnE.HasValue && t2.ColumnF == 0) .Select(t2 => t2.FkColumnA) .Contains(t1.ColumnA));
Cela entraîne un IEnumerable<T1>
que vous pouvez utiliser selon vos besoins.
Pour autant que je sache, il n'y a pas de "documentation" sur la syntaxe de conversion, en tant que développeur, c'est votre travail. Cependant, je trouve personnellement LINQPad très utile lors de la construction d'instructions LINQ.