2010-05-26 2 views
0

J'ai une requête LINQ qui utilise 1 table + un grand nombre de vues. Je voudrais pouvoir écrire quelque chose comme ceci:Comment combiner une requête LINQ avec un IQueryable? <Guid>

IQueryable<Guid> mostViewedWriters; 

switch (datePicker) 
{ 
    case DatePicker.Last12Hours: 
     mostViewedWriters = from x in context.tempMostViewed12Hours 
          select x.GuidId; 
     break; 
    case DatePicker.Last24Hours: 
     mostViewedWriters = from x in context.tempMostViewed24Hours 
          select x.GuidId; 
     break; 
    case DatePicker.Last36Hours: 
     mostViewedWriters = from x in context.tempMostViewed36Hours 
          select x.GuidId; 
     break; 
} 

var query = from x1 in context.Articles 
join x2 in context.Authors on x1.AuthorId == x2.AuthorId 
join x3 in mostViewedWriters on x2.AuthorId == x3.Id 
select new { x2.AuthorName, x1.ArticleId, x1.ArticleTitle }; 

ci-dessus C# est pseudo-code écrit pour protéger les innocents (moi). L'essentiel de la question est la suivante: J'ai une requête qui est liée aux résultats d'une vue. Ce point de vue pourrait cependant être l'un des nombreux points de vue différents. Toutes les vues renvoient le même type de données. Je pensais que je pourrais être en mesure de créer un IQueryable qui contiendrait les Ids dont j'ai besoin et utiliser cette requête. Hélas, cet effort a calé.

+0

En principe, je pense que ce que vous décrivez devrait fonctionner (bien qu'il puisse y avoir de nombreux problèmes techniques). Si vous essayez de compiler et d'exécuter votre échantillon, qu'obtenez-vous? –

+0

Je pense que vous vouliez utiliser différents noms de vue dans votre pseudocode, par exemple. context.tempMostViewed36Hours. Non? – roufamatic

+0

roufamatic, vous avez raison. Merci. – John

Répondre

1

votre problème est que mostViewedWriters ne disposent pas de champs nommés parce que sa juste une collection/requête qui renvoie une liste des Guid « s, vous devriez donc réécrire votre requête comme ceci:

var query = from article in context.Articles 
      join author in context.Authors on article.AuthorId == author.AuthorId 
      join id in mostViewedWriters on author.AuthorId == id 
      select new { x2.AuthorName, x1.ArticleId, x1.ArticleTitle }; 

La seconde jointure La condition rejoint directement la valeur de la ligne, parce que c'est juste un Guid. (J'ai aussi changé vos noms de variable pour essayer de le rendre un peu plus clair)

+0

Exactement ce que je cherchais. Merci. – John

Questions connexes