2010-08-17 3 views
1

Est-il possible de fusionner la requête linq ci-dessous en une requête?Filtre sur l'énumérable sélectionné dans une requête linq

var checkBoxes = from x in FindAll<CheckBox>() 
       where x.Checked 
       select new 
       { 
        RecordType = Type.GetType(x.Attributes["RecordType"]), 
        RecordId = Int32.Parse(x.Attributes["RecordId"]) 
       }; 

checkBoxes = from x in checkBoxes 
      where x.RecordType != typeof(DomainModel.Group) 
      select x; 

Répondre

5
var checkBoxes = from x in FindAll<CheckBox>() 
       let recordType = Type.GetType(x.Attributes["RecordType"]) 
       where x.Checked && recordType != typeof(DomainModel.Group) 
       select new 
       { 
        RecordType = recordType, 
        RecordId = Int32.Parse(x.Attributes["RecordId"]) 
       }; 
+0

Ah. Bien sur :) Merci pour votre réponse rapide! – asgerhallas

+0

Il sera accepté dans 8 minutes. – asgerhallas

+0

+1 en utilisant let mot-clé est une bonne idée. btw pouvons-nous utiliser une méthode comme "let" mot-clé dans les expressions linq génériques? vois ma réponse. –

0
var checkboxes = FindAll<CheckBox>() 
        .Where(x => x.Checked && Type.GetType(x.Attributes["RecordType"]) != typeof(DomainModel.Group)) 
        .Select(new{ 
          RecordType = Type.GetType(x.Attributes["RecordType"]), 
          RecordId = Int32.Parse(x.Attributes["RecordId"]) 
        }); 
3

La réponse de lasseespeholt est parfaitement bien (préférable, même - il est inutile de faire une projection si vous allez jeter le résultat), mais si vous voulez appliquer cette plus en général, vous pouvez utiliser une suite de requête :

var checkBoxes = from x in FindAll<CheckBox>() 
       where x.Checked 
       select new 
       { 
        RecordType = Type.GetType(x.Attributes["RecordType"]), 
        RecordId = Int32.Parse(x.Attributes["RecordId"]) 
       } into y 
       where y.RecordType != typeof(DomainModel.Group) 
       select y; 

ici, j'ai changé la deuxième variable x-y pour préciser qu'il est distinct de l'original x, mais vous n'avez pas à le faire.

Une autre alternative qui évite d'appeler deux fois Type.GetType mais mettre encore la clause where avant la projection finale consiste à utiliser une clause let (qui introduit une autre projection elle-même, il est vrai):

var checkBoxes = from x in FindAll<CheckBox>() 
       where x.Checked 
       let t = Type.GetType(x.Attributes["RecordType]") 
       where t != typeof(DomainModel.Group) 
       select new 
       { 
        RecordType = t 
        RecordId = Int32.Parse(x.Attributes["RecordId"]) 
       }; 
+0

+1 Pour "select ... into ...". Personnellement, je pense qu'il est plus joli de ne pas "laisser" dans les clauses "où". –

+0

@lasseespeholt: On note vraiment "à l'intérieur" de la clause where - il y a deux clauses where et une clause let, toutes indépendantes. –

+0

Désolé pour mon anglais incorrect. Je voulais dire à l'intérieur = entre :) –

0

Pourquoi voudriez-vous changer en une requête linq? Linq utilise une exécution différée et ne s'exécutera que lorsque vous utiliserez la sortie quelque part. Pendant ce temps, continue à construire l'arbre d'expression. Ce que vous avez est parfaitement lisible. Je ne changerais que si vous pensez que cela le rend plus lisible.

Questions connexes