2011-08-31 13 views
7

è possibile estendere la query-parole chiave di Linq (come: selezionare, dove, ecc.) Con le proprie definizioni?È possibile estendere le parole chiave di ricerca in C#/LINQ?

Codeexample per renderlo più chiaro:

System.Collections.Generic.List<string> aList = 
    new System.Collections.Generic.List<string> { "aa", "ab", "ba", "bb" }; 

// instead of 
string firstString = (from item in aList 
         where item.StartsWith("a") 
         select item).First(); 

// would be nice 
string firstString = from item in aList 
        where item.StartsWith("a") 
        selectFirst item; 

// or something else 
from item in aList 
where item.StartsWith("a") 
WriteLineToConsole item; 

penso che non è possibile, ma ancora sperare;)

+0

Qualsiasi motivo particolare per cui vorresti farlo? – AakashM

+0

Tre utenti da 400K + hanno risposto alla tua domanda. Vai, massacra una capra! – dotNET

risposta

6

Un modo per raggiungere questo obiettivo sarebbe quello di scrivere un pre-processore che trasformerà la vostra abitudine Parole chiave LINQ in parole chiave LINQ standard prima di inviarle al compilatore. A proposito, è così che funziona con le parole chiave LINQ standard. Un pre-processore li converte in normali metodi di estensione (.Seleziona, .Where, .GroupBy, ...), quindi lo alimenta al compilatore che non capisce quelle parole chiave.

Ovviamente facendo questo si perderà Intellisense, ma questo potrebbe essere risolto scrivendo un'estensione di Visual Studio. Potrebbe essere un bel po 'di lavoro, però, per questo zucchero.

+1

Puoi fornire alcuni punti di partenza per queste estensioni? – Matthias

+0

Sappi che è una domanda molto vecchia, ma sei riuscito a fare qualcosa per le parole chiave personalizzate? –

4

No, non è possibile all'interno del linguaggio specifico o di qualsiasi compilatore C# corrente. Tutto ciò che crei non sarebbe più (puro) C#.

6

Non è possibile aggiungere le proprie parole chiave contestuali, ma si può può influenzare ciò che significano quelle esistenti.

Ad esempio, questo codice:

string firstString = (from item in aList 
         where item.StartsWith("a") 
         select item).First(); 

è effettivamente pre-elaborato a:

string firstString = aList.Where(item => item.StartsWith("a")) 
          .First(); 

... quindi se si cambia il significato di questi Where e First chiamate di metodo, è possibile influenzare il comportamento .

Se avete lo stomaco per esso, si potrebbe desiderare di guardare this Stack Overflow answer ho scritto qualche tempo fa, che modifica il comportamento di where in LINQ to Entities in determinate circostanze. È un codice malvagio e malvagio.

Problemi correlati