2009-06-07 5 views
5

Contains J'ai une méthode d'extension qui est censé filtrer un objet Queryable (IQueryable) basée sur une collection de Ids ....débordement de pile dans LINQ to SQL et le mot-clé

Notez que IQueryable provient de mon base de données via une requête LinqToSql

public static IQueryable<NewsItemSummary> WithID(this IQueryable<NewsItemSummary> qry, IQueryable<Guid> Ids) 
    { 
     return from newsItemSummary in qry 
       where Ids.Contains(newsItemSummary.ID) 
       select newsItemSummary; 
    } 

Si Ids sont créés à partir d'un tableau ou d'une liste et passé comme une liste interrogeable, cela ne fonctionne pas

Par exemple ...

GetNewsItemSummary().WithID(ids.AsQueryable<Guid>()) 

Si Ids se compose d'une forme de demande LinqToSql, il ne fonctionne pas !!

Ceci est connu numéro: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=355026

collection Mon Ids ne peut pas venir d'une demande LinqToSql ...

Remarque, si je change la fonction afin qu'elle consomme et IList plutôt que d'un IQueryable .. ..

public static IQueryable<NewsItemSummary> WithID(this IQueryable<NewsItemSummary> qry, IList<Guid> Ids) 
    { 
     return from newsItemSummary in qry 
       where Ids.Contains(newsItemSummary.ID) 
       select newsItemSummary; 
    } 

Je reçois maintenant l'exception suivante:

Method 'Boolean Contains(System.Guid)' has no supported translation to SQL. 

Alors ... tout ce que je veux faire est de filtrer ma collection de nouvelles basées sur une liste ou un tableau de Guids .... Idées ???

+0

Pour que vous le sachiez, la balise "stackoverflow" est généralement utilisée pour les méta-questions, tandis que la balise "stack-overflow" est préférable pour les débordements de pile réels. – Zifre

Répondre

11

Cela va se traduire.

public static IQueryable<NewsItemSummary> WithID(
    this IQueryable<NewsItemSummary> qry, 
    List<Guid> Ids 
) 
    { 
     return from newsItemSummary in qry 
       where Ids.Contains(newsItemSummary.ID) 
       select newsItemSummary; 
    } 
) 

Traduction du Contient méthode par rapport à des collections locales a été l'une des dernières fonctionnalités ajoutées dans le développement de LINQ to SQL pour .NET 3.5, donc il y a certains cas que vous attendez un travail qui ne le font pas - par exemple comme traduction de IList<T>. Par ailleurs, sachez que LinqToSql convertira heureusement les listes contenant un grand nombre d'éléments (j'ai vu plus de 50 000 éléments), mais SQL Server n'acceptera que 2 100 paramètres pour une seule requête.

+2

Bien que la question et la réponse ne correspondent pas exactement à mon problème, elles m'ont aidé à trouver la solution, c'est-à-dire à changer mes 'IList <>' '' List <> 's. Lame bug ... – craastad