è possibile utilizzare Take in LINQ quando la query restituisce un tipo anonimo?
-
06-07-2019 - |
Domanda
Sto cercando di estrarre l'elemento n-esimo da un elenco di tipi anonimi restituiti da una query LINQ in cui n è un numero casuale compreso tra 0 e 100. Adesso non ci riesco e non ricevo in qualunque posto. Il mio codice (con i nomi modificati per proteggere l'IP):
var query = from Table1 t1 in theContext.Table1
join Table2 t2 in theContext.Table2
on ...
where ...
select new
{
partNum = t1.part_number,
partSource = t2.part_source
}
int num = new Random().Next(0, 100);
// here's where the code I've tried fails
Posso in qualche modo fare un Take<T>(100).ToList<T>()[num]
per ottenere un singolo tipo anonimo con partNum e partSource? Ho finito per risolverlo definendo esplicitamente un tipo, ma sembrava che mi mancasse una soluzione più elegante qui. Tutto quello che voglio fare è restituire un Dictionary<string, string>
al chiamante, quindi preferirei non dover definire un tipo al di fuori di questo metodo.
Aggiorna : ElementAt non funziona per questo. Ho provato ad aggiungere:
// get a random part from the parts list
int num = new Random().Next(0, query.Count() - 1 );
var nthElement = query.ElementAt(num);
E ho ottenuto un'eccezione: The query operator 'ElementAt' is not supported.
Soluzione
Dovresti essere in grado di usare:
var item = query.Take(100).ToList()[num];
Certo, sarebbe più efficiente fare:
var item = query.Skip(num).First();
Altri suggerimenti
Credo che tu voglia solo il metodo di estensione ElementAt
:
var nthElement = query.ElementAt(num);
Non c'è bisogno di pasticciare con Take
query o simili, e certamente non ToList
.