2011-06-07 7 views
2

J'ai une méthode qui accepte une date dtSince et une chaîne component comme paramètres. J'ai besoin d'écrire une requête Linq d'une ligne qui recherche les entrées qui se sont produites avant dtSince et est du composant component (si spécifié). J'ai essayé ce qui suit:Erreur non prise en charge

var result = from items in MyAzureTable 
      where items.Occured >= dtSince 
      && items.Component == (component ?? items.Component) 
      select items; 

Mais j'obtiens une erreur NotSupported. Je suppose que le items.Component == (component ?? items.Component) est le problème.

Comme mentionné, component peut être nul ou vide. Mais je ne peux pas exclure que, dans la requête initiale, parce que cela:

var result = from items in MyAzureTable 
      where items.Occured >= dtSince 
      select items; 

pourrait revenir plus de 1000 lignes (ce qui semble être la limite par défaut des tables Azure) et donc je ne peux pas filtrer le component plus tard. Si je fais quelque chose comme le ci-dessous, l'entrée que je pourrais chercher est à la ligne 1001. Ainsi, cela ne me donnera pas le résultat que je cherche.

if (!String.IsNullOrEmpty(component)) 
{ 
    result = result.Where(x => x.Component == component).ToList<>(); 
} 

Question: Est-il possible d'avoir une ligne de requête LINQ qui peut vérifier une chaîne non vide avant de l'utiliser dans une clause where?

+0

Est-azur vraiment pas fournir une API '' IQueryable ? Je m'attendrais à ce que 'where'" compose "... –

+0

@Marc, Il semble y avoir une limite de lignes interrogeables dans les tables Azure. Ce type essaie d'interroger 200 millions, et voir ce qui s'est passé. ;) http://stackoverflow.com/questions/5837213/azure-querying-200-million-entities –

+0

@Alex - mais c'est différent; en * composant * une requête que vous devriez filtrer * avant * que la requête ne soit envoyée au serveur, donc la requête finale n'effectuera pas (ou ne devrait pas) exécuter la requête ouverte –

Répondre

1

Essayez ceci:

var result = from items in MyAzureTable 
      where items.Occured >= dtSince && 
        (component == null || items.Component == component) 
      select items; 
+0

Merci cela a fonctionné. –

Questions connexes