L’obiettivo è la costruzione di un metodo (sia esso public, protected o private)
che ci consenta di estrarre una lista di stringhe.
La signature del nostro metodo sarà:
1
| public List<string> getMyString() |
Nel caso specifico vogliamo estrarre un set di dati rappresentati
da una e sola colonna di una tabella del nostro database.
Istintivamente, ci verrebbe da scrivere un pezzo di codice del tipo:
1
2
3
| var q = from t in context.myentity
select new { Codice = t.mycodice };
List<string> listaCodici = q1.ToList(); |
Ovviamente è errato, sintatticamente e semanticamente.
Non è corretto supporre che, essendo il campo mycodice, un campo varchar, esso venga poi rimappato in un insieme di stringhe. Il compilatore, quindi, tornerà il seguente errore:
Cannot implicitly convert type
‘System.Collections.Generic.List<anonymoustype #1>’ to ‘System.Collections.Generic.List<string>’
Esistono due diverse strade per ottemperare al nostro obiettivo.
La prima è quella di definire una struct o una classe customizzata che contenga al suo interno la property, stringa, che andremo poi a valorizzare estraendo i dati dal database tramite LINQ.
La seconda è quella di scrivere un pezzo di codice come:
1
2
3
4
5
| var q = from t in context.myentity
let codici = new { t.mycodice }
select codici;
List<string> listaCodici = (from c in q
select c.mycodice).ToList(); |
Related Posts:
Tags:
.net framework 3.5, c#, LINQ
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:
Tags:
.net framework 3.5, c#, LINQ
Il sito rai.tv su android: problemi con silverlight
RFOPortal online!
Superenalotto: e se fosse truccato?
Sony: pessima gestione ecommerce