2014-09-05 2 views
0

Ok, donc je suis en train de tourner ceci:Possibilité d'utiliser des membres de type anonyme lors de la déclaration?

sSelect = "SELECT CONVERT(VARCHAR, CommitDate, 101) AS XLabel, " + 
    "SUM(CASE WHEN NOT CompletionDate IS NULL THEN 1 ELSE 0 END) AS ClosedEvents, " + 
    "COUNT(CommitDate) AS Total, " + 
    "COUNT(CommitDate) - SUM(CASE WHEN NOT CompletionDate IS NULL THEN 1 ELSE 0 END) AS OpenEvents, " + 
    "SUM(CASE WHEN CompletionDate IS NULL AND commitdate < Convert(varchar(12),getdate(),101) THEN 1 ELSE 0 END) AS BehindSchedule"; 

dans une requête Linq. Jusqu'ici j'ai:

var vEventsEntriesEnum = dtEventsEntries.AsEnumerable(); 

var vOpenEntriesData = from r in vEventsEntriesEnum 
select new 
{ 
    XLabel = r["CommitDate"], 
    ClosedEvents = vEventsEntriesEnum.Sum(closed => (closed["CompletionDate"] != null) ? 1 : 0), 
    Total = vEventsEntriesEnum.Count(total => (total["CommitDate"] != null) ? true : false), 
    OpenEvents = Total - ClosedEvents, 
}; 

où je me suis rendu compte que je pourrais avoir un problème. Total et ClosedEvents n'existent pas dans ce contexte. Bien que je puisse simplement aller de l'avant et répéter les requêtes pour ClosedEvents et Total et lancer puis les soustraire ou quoi que ce soit, j'espérais qu'il y aurait un meilleur moyen.

S'il y a d'autres façons de faire ce que je fais avec le reste du code, n'hésitez pas à me le faire savoir.

Des idées?

+0

Si vous créez une classe réelle au lieu d'un type anonyme, alors votre propriété 'OpenEvents' peut simplement renvoyer' Total - ClosedEvents' –

+0

Cela pourrait aussi être plus facile à long terme. Je vous remercie! – Aphrodisizach

Répondre

0

Vous devez le matérialiser quelque part. Dans la syntaxe de requête, vous pouvez utiliser le let clause:

var vOpenEntriesData = from r in vEventsEntriesEnum 
    let ClosedEvents = vEventsEntriesEnum.Sum(closed => (closed["CompletionDate"] != null) ? 1 : 0) 
    select new 
    { 
     XLabel = r["CommitDate"], 
     ClosedEvents, 
     Total = vEventsEntriesEnum.Count(total => (total["CommitDate"] != null) ? true : false), 
     OpenEvents = Total - ClosedEvents, 
    }; 

Ceci est similaire à une variable dans une boucle.

Questions connexes