2012-02-07 33 views

risposta

49

IQueryable Gli oggetti sono prodotti da Provider Queryable (ad esempio LINQ to SQL, LINQ a Entities/Entity Framework, ecc.). Praticamente nulla è possibile creare un'istanza con new negli strumenti di base di .NET Framework IQueryable.

IQueryable è un'interfaccia progettata per essere utilizzato per creare provider Queryable, che permettono la libreria LINQ per essere sfruttato un archivio dati esterno costruendo un albero di espressione parse-grado. Per natura, i query richiedono un contesto: informazioni su cosa esattamente stai interrogando. L'utilizzo di new per creare qualsiasi tipo IQueryable, indipendentemente dal fatto che sia possibile, non ti porta molto lontano.

Detto questo, qualsiasi IEnumerable può essere convertito in un IQueryable utilizzando il metodo di estensione AsQueryable(). Questo crea un costrutto diverso dietro le quinte molto simile allo , come quando si usano i metodi LINQ contro un semplice oggetto IEnumerable. Questa è probabilmente la fonte più abbondante di queryables a cui hai accesso senza creare un vero provider IQueryable. Questo passaggio è molto utile per gli algoritmi basati su LINQ che testano l'unità in quanto non è necessario l'archivio dati effettivo, ma solo un elenco di dati in memoria che possono essere imitati.

+2

Grazie. Il tuo scenario descritto (test unitario) è praticamente quello che sto facendo. Conosci qualche buona documentazione sulle differenze di costruzione che menzioni? Sono curioso di sapere di più su quanto sia diverso l'oggetto quando si usa il metodo di estensione 'AsQueryable()'. –

+5

È MOLTO diverso. Invece di una catena di oggetti Iterator come prodotto dai metodi IEnumerable Linq, i metodi IQueryable aggiungono nodi a un albero delle espressioni. Questo albero non è, di per sé, eseguibile come codice come un Iterator. Ma è serializzabile, parsabile, ecc. In modo da poter determinare la struttura della query e trasformarla in una query in un'altra lingua come SQL. – KeithS

+0

Guarda questa domanda e tutti i link correlati: http://stackoverflow.com/questions/252785/what-is-the-difference-between-iqueryablet-and-ienumerablet – KeithS

2

Beh, la sua domanda è un po 'strano ... ma io credo che se si guarda a un'interfaccia in Reflector, che vi darà una lista di esecutori nelle assemblee caricati.

Come disclaimer non ho usato Reflector da quando è andato in pay-per-play, quindi potrei sbagliarmi.

3

EntityCollection fa, così come EnumerableQuery.

Non che io pensi che uno di questi ti porterà ovunque. Per aiutare, abbiamo bisogno di sapere cosa stai veramente cercando di risolvere. Se stai scrivendo un provider LINQ, dovresti leggere questo: http://msdn.microsoft.com/en-us/library/bb546158.aspx.

Si consiglia di scrivere la propria implementazione.

+0

Grazie. Scusa per la confusione nel post iniziale; Non sto cercando aiuto con il mio codice, sto solo imparando nuovi oggetti C# con cui giocare. –

+0

Non vedo EntityCollection che implementa IQueryable ovunque ... –

Problemi correlati