2010-01-13 5 views
0

Je suis en train d'écrire quelque chose comme ceci:Nested requêtes LINQ Saga

SELECT s.CompanyID, 
     s.ShareDate, 
     s.OutstandingShares, 
     s.ControlBlock 
FROM (
    SELECT MAX(ShareDate) AS Sharedate, 
      CompanyID 
    FROM ShareInfo 
    WHERE (ShareDate <= @filter_date) 
    GROUP BY CompanyID 
) AS si 
INNER JOIN 
tblShareInfo AS s ON s.ShareDate = si.Sharedate AND s.CompanyID = si.CompanyID 

Essentiellement, cela essaie de revenir le plus récent Partager l'information, nous gardons une histoire en cours d'exécution. Maintenant, j'essaie d'écrire quelque chose de similaire à cela dans LINQ.

Voici était ma tentative la plus proche:

From a _ 
In db_context.ShareInfos _ 
Where a.ShareDate <= filter_date _ 
Group a By a.CompanyID Into Group _ 
Select CompanyID, MostRecentShareDate = Group.Max(Function(a) a.ShareDate) _ 
Join b In db_context.ShareInfos On b.CompanyID Equals a.CompanyID _ 
Select b.CompanyID, b.ShareDate, b.OS, b.CB() 

Malheureusement, cela ne compile pas. Évidemment, je ne comprends pas la syntaxe LINQ en quelque sorte. Quelqu'un peut-il me diriger dans la bonne direction?

Merci.

Répondre

0

Ok semble donc comme cela doit être fait en utilisant deux déclarations:

Dim MostRecentShareDates = _ 
From s2 In query_collection.DBContext.ShareInfos _ 
Where s2.ShareDate <= filter_date _ 
Group s2 By s2.CompanyID Into Group _ 
Select New With { _ 
        .CompanyID = CompanyID, _ 
        .MostRecentShareDate = Group.Max(Function(s3) s3.ShareDate) _ 
       } 

Return From s In query_collection.DBContext.ShareInfos _ 
     Join s1 In MostRecentShareDates On s.CompanyID Equals s1.CompanyID And s.ShareDate Equals s1.MostRecentShareDate _ 
     Select New With { _ 
         .CompanyID = s.CompanyID, _ 
         .ShareDate = s.ShareDate, _ 
         .OS = s.OS, _ 
         .CB = s.CB _ 
         } 

I essayé en utilisant le mot-clé 'Let' pour intégrer la première déclaration dans la seconde, mais cela ne compilerait pas non plus. Maintenant, la bonne chose à propos de ceci est que Linq a retardé l'exécution, donc jusqu'à ce que vous traversiez la collection retournée par la seconde instruction, aucun SQL n'est généré. Linq est alors assez intelligent pour combiner les deux fragments de code en une instruction SQL, essentiellement exactement la même déclaration que celle que j'ai écrite dans mon SQL d'origine ci-dessus.

0

avec votre dernière instruction select vous devez utiliser

select new { 

CompanyID = b.CompanyID, 
ShareDate = b.ShareDate, 
OS = b.OS, 
CB = b.CB 
}; 

qui est un début ...

+0

Ceci est la syntaxe C#, btw ... –

+0

Je suppose que je devrais mentionner que la partie qui ne compile pas est la ligne avec la jointure sur elle. Le 'a.CompanyID' à la fin de la ligne donne l'erreur "Name 'a' n'est pas déclaré ou pas dans la portée actuelle" – Bitfiddler