Supponiamo di avere un'espressione IQueryable<T>
che mi piacerebbe incapsulare la definizione di, archiviarla e riutilizzarla o incorporarla in una query più ampia in seguito. Ad esempio:Come mantenere LINQ esecuzione differita?
Ora credo di poter mantenere l'oggetto myQuery e utilizzarlo come descritto. Ma alcune cose che non sono sicuro:
Il modo migliore per parametrizzare esso? Inizialmente l'ho definito in un metodo e poi ho restituito
IQueryable<T>
come risultato del metodo. In questo modo posso definireblah
ebar
come argomenti del metodo e immagino che crei appena un nuovoIQueryable<T>
ogni volta. È questo il modo migliore per incapsulare la logica di unIQueryable<T>
? Ci sono altri modi?Cosa succede se la mia query si risolve in uno scalare anziché in
IQueryable
? Ad esempio, cosa succede se voglio che questa query sia esattamente come mostrato ma aggiungo.Any()
per farmi sapere se ci sono risultati corrispondenti? Se aggiungo il(...).Any()
, il risultato èbool
e viene eseguito immediatamente, giusto? C'è un modo per utilizzare questi operatoriQueryable
(Any
,SindleOrDefault
, ecc.) Senza eseguire immediatamente? Come gestisce LINQ-to-SQL?
Edit: Part 2 è davvero più di cercare di capire quali sono le differenze tra di limitazione IQueryable<T>.Where(Expression<Func<T, bool>>)
vs. IQueryable<T>.Any(Expression<Func<T, bool>>)
. Sembra che quest'ultimo non sia così flessibile quando si creano query più ampie in cui l'esecuzione deve essere ritardata. È possibile aggiungere Where()
e quindi altri costrutti possono essere successivamente aggiunti e infine eseguiti. Poiché Any()
restituisce un valore scalare, sembra che verrà eseguito immediatamente prima che sia possibile creare il resto della query.
Sembra in # 1, avere un metodo che essenzialmente costruisce un nuovo 'IQueryable' ogni volta è una * cosa buona * poiché in questo modo non mi imbatterò in problemi con lo smaltimento. In # 2, sono confuso da come LINQ-to-SQL può tradurre l'operatore 'Any', ma non posso differire. Se dovessi usare un operatore 'Any' all'interno di una query più grande, viene eseguito immediatamente anche lì, o fa parte dell'esecuzione della query più grande? – mckamey
OK Penso di esserci quasi. Se dovessi incorporare un '.Any()' in una clausola 'where' allora non lo eseguirà in un ciclo, corretto? Dovrebbe compilare l'espressione SQL appropriata e inviarlo. Quindi, in effetti, non è '. Any()' che impedisce l'esecuzione differita in quanto è come viene utilizzato. Fondamentalmente se il risultato di una query * whole * è uno scalare, allora le figure del compilatore ti richiedono il risultato ora piuttosto che continuare con la creazione di un 'IQueryable'. –
mckamey
@McKAMEY corretto, non appena si utilizza .Any() in un contesto che non è deferrabile, verrà eseguito. Nel caso di .Where() sta cercando un'espressione, che è deferrabile, quindi stai bene. Nel caso di var o del ciclo foreach, quelli causano l'esecuzione perché non sono differibili. – Joseph