Question

I ai une méthode d'extension qui est censé filtrer un objet Queryable (IQueryable) sur la base d'une collection de Ids ....

Notez que IQueryable provient de ma 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 est composé d'une forme de demande LinqToSql, il ne fonctionne pas !!

Ceci est problème connu: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback. aspx? FeedbackID = 355026

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

Remarque, si je change la fonction afin qu'elle consomme et IList plutôt que 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 filtrer ma collection de nouvelles sur la base d'une liste ou un tableau de Guids .... Des idées ???

Était-ce utile?

La solution

Cela se traduira par.

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 de la méthode Contains contre les 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 - comme la traduction de IList<T> .

En outre, il faut savoir que tout LinqToSql se fera un plaisir de traduire les listes contenant un grand nombre d'articles (je l'ai vu faire plus de 50 000 éléments), SQL Server n'accepte 2.100 paramètres pour une seule requête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top