C# 3.5 LINQ: restituire una lista tipizzata LIST<T>

Ipotizziamo di creare una solution in Visual Studio 2008 che strutturi
la nostra web application su n layer con un Object Model.
Il progetto Object Model conterrà l’Entity Model generato da VS2008.

Il DAL contiene, invece, il cuore dell’accesso ai dati: è nel DAL che
andremo a creare i metodi con le query LINQ per estrarre i dati secondo
le nostre esigenze.

L’obiettivo è quello di estrarre un sottoinsieme dei campi contenuti
nella tabella
, dalla quale VS2008 ha creato il modello delle Entity.

Chiamiamo AEntity l’entity definita nel modello.
Intuitivamente vorremmo scrivere un blocco di codice di questo tipo,
dove BaseDataAccess contiene la dichiarazione dell’oggetto context:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class DizionarioDataAccess : BaseDataAccess
{
    public List<objectmodel.AEntity> GetAll()
    {
       var items = from t in context.AEntity
                       select new
                       {
                           Nome = t.TABLE_NAME,
                           Cognome = t.TABLE_COGNOME
                       };
 
       return items.ToList<objectmodel.AEntity>();
    }

Il compilatore tornerà questo errore:

‘System.Linq.IQueryable<anonymoustype #1>’ does not contain a
definition for ‘ToList’ and the best extension method overload
‘System.Linq.Enumerable.ToList<tsource>
(System.Collections.Generic.IEnumerable<tsource>)’

has some invalid arguments

L’errore deriva dal fatto che con la direttiva select new, stiamo andando
a definire un nuovo oggetto che poco ha a che fare con l’Entity definita nel nostro modello.
Per risolvere il problema possiamo seguire due strade: o imponiamo che il
tipo tornato dal nostro metodo sia IQueryable, o creiamo un oggetto customizzato che abbia al suo
interno solo le proprietà che vogliamo valorizzare ed estrarre dal db.

Related Posts: