2010-10-05 4 views
-2

Je souhaite convertir une requête serveur sql suivante avec requête Linq-to-sql. Ce que je dois faire. comment ça va être? J'utilise C#.Quelle serait la requête Linq to sql identique pour cette requête de serveur sql?

SELECT  Table1.CRNo, Table2.StageId 

FROM   Table1 INNER JOIN Table2 
      ON Table1.CRNo = Table2.CRNo 

WHERE  (Table2.IsActive = 'true') 

Le tableau 1 et le tableau 2 sont deux tableaux. CRNo est identique dans les deux tables. Le tableau 2 est un tableau détaillé du tableau 1.

Quelle devrait être la requête.

Modifié:

from record1 in table1 
join record2 in table2 on record1.CRNo equals record2.CRNo 
where record2.IsActive 
select new { record1.CRNo, record2.StageId } 

sans aucun doute, il fonctionne très bien. mais les résultats viennent avec un enregistrement qui est aussi faux IsActive s'il y a plusieurs entrées dans la table2. Disons que le tableau 2 ont des dossiers comme:

CRNo:1 StageId: 1 IsActive:False 
CRNo:2 StageId: 1 IsActive:False 
CRNo:1 StageId: 2 IsActive:True 

Ensuite, cela vient avec Črno 1 à l'étape 1, qui a IsActive Faux. Pourquoi cela devrait-il se produire? S'il vous plaît votre avis sur ce nouveau

+1

-1: Qu'avez-vous essayé? http://stackoverflow.com/questions/how-to-ask –

Répondre

3
from record1 in table1 
join record2 in table2 on record1.CRNo equals record2.CRNo 
where record2.IsActive 
select new { record1.CRNo, record2.StageId } 
+0

définitivement, ça fonctionne bien. mais les résultats viennent avec un enregistrement qui est aussi faux IsActive s'il y a plusieurs entrées dans la table2. disons que la table 2 a des enregistrements comme CRNo: 1 StageId: 1 IsActive: False | CRNo: 2 StageId: 1 IsActive: False | CRNo: 1 StageId: 2 IsActive: True Ensuite, cela vient avec CRNo 1 avec l'étape 2, qui a IsActive False. Pourquoi cela devrait-il arriver? –

+0

Parce que CRNo 1, StageId: 2 est actif. Si vous voulez seulement considérer les entrées actives dans la requête, vous devez d'abord filtrer avant de faire la jointure. Voir modifier dans mon message. – AxelEckenberger

+0

Comme le dit Obalix, CRNo 1, StageId 2 est actif, il sera retourné correctement. Les deux autres enregistrements ne seront pas renvoyés car ils ne sont pas actifs. Il filtre correctement en fonction de l'indicateur IsActive:/ –

0

Si les tables ont une relation clé étrangère présente en vous la base de données - ou le modèle dans votre dbml - vous pouvez également effectuer les opérations suivantes:

from t1 in Table1 
where t1.Table2.IsActive == "true" // assuming that IsActive is a string and not a boolean 
select new { t1.CRNo, t1.Table2.StageId } 

Pour accélérer les choses que vous devriez peut-être utiliser DataLoadOptions pour spécifier que pour chaque t1 l'entrée Table2 doit être récupérée aussi:

using (ctx = new MyDataContext()) { 
    var options = new DataLoadOptions(); 
    options.LoadWith<Table1>(x => x.Table2); 
    ctx.LoadOptions = options; 

    var res = from t1 in Table1 
      where t1.Table2.IsActive == "true" 
      select new { t1.CRNo, t1.Table2.StageId }; 

} 

En outre, vous pouvez vouloir look here pour des exemples de la syntaxe linq.

Edit - à ne considérer que les entrées actives:

from t1 in table1 
join t2 in table2.Where(x => x.IsActive == "true") on t1.CRNo equals t2.CRNo 
select new { t1.CRNo, t2.StageNo }; 
+0

Selon LinqPad cette deuxième requête génère le même SQL que si la clause where faisait partie du corps de la requête principale ... –