Sintassi Linq: selezione di più colonne


96

Questa è la mia sintassi Linq che sto usando per il mio modello di entità

IQueryable<string> objEmployee = null;

objEmployee = from res in _db.EMPLOYEEs
              where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
              select res.EMAIL;

Come posso selezionare più colonne? Come se volessi selezionare anche l'ID res. E come posso riceverli? IQueryable non funzionerà credo. E questo si chiama Linq to SQL, giusto?


3
LinqToSql e il framework di entità sono diversi. Vedere stackoverflow.com/questions/8676/...
Gideon

Risposte:


189

Come hanno indicato le altre risposte, è necessario utilizzare un tipo anonimo.

Per quanto riguarda la sintassi, personalmente preferisco di gran lunga il concatenamento di metodi. L'equivalente di concatenamento del metodo sarebbe: -

var employee = _db.EMPLOYEEs
    .Where(x => x.EMAIL == givenInfo || x.USER_NAME == givenInfo)
    .Select(x => new { x.EMAIL, x.ID });

Per quanto ne so, la sintassi dichiarativa LINQ viene convertita in una catena di chiamate al metodo simile a questa quando viene compilata.

AGGIORNARE

Se vuoi l'intero oggetto, devi solo omettere la chiamata a Select(), ie

var employee = _db.EMPLOYEEs
    .Where(x => x.EMAIL == givenInfo || x.USER_NAME == givenInfo);

72

Puoi usare tipi anonimi ad esempio:

  var empData = from res in _db.EMPLOYEEs
                where res.EMAIL == givenInfo || res.USER_NAME == givenInfo
                select new { res.EMAIL, res.USER_NAME };

puoi suggerirmi come scrivere correttamente questa espressione: select new {(DateTime.Now - debt.ClaimDate), debt.Amount}; ? Viene visualizzato un errore: Dichiaratore membro di tipo anonimo non valido
Dainius Kreivys

1
@DainiusKreivys select new { Diff = (DateTime.Now - debt.ClaimDate), Amount = debt.Amount}. Il modulo utilizzato nella risposta è una scorciatoia, dove il nome del membro nell'espressione di inizializzazione viene utilizzato come nome di campo di tipo anonimo. Ad esempio, new {res.EMAIL, res.USER_NAME}è una scorciatoia per new {EMAIL = res.EMAIL, USER_NAME = res.USER_NAME}. Nel caso in cui ci sia un'espressione, come nel tuo caso con le date, l'abbreviazione non è applicabile, quindi errore del compilatore.
Ivan Danilov

5
 var employee =  (from res in _db.EMPLOYEEs
 where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
 select new {res.EMAIL, res.USERNAME} );

O puoi usare

 var employee =  (from res in _db.EMPLOYEEs
 where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
 select new {email=res.EMAIL, username=res.USERNAME} );

Spiegazione :

  1. Seleziona dipendente dal database come res.

  2. Filtra i dettagli del dipendente in base alla condizione where.

  3. Seleziona i campi obbligatori dall'oggetto dipendente creando un oggetto anonimo utilizzando il nuovo {}


aggiungi una spiegazione in risposta.
Sandeep

Come si accede alle diverse colonne?
ARidder101
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.