Sintaxis de Linq: selección de varias columnas

96

Esta es mi sintaxis Linq que estoy usando para mi modelo de entidad

IQueryable<string> objEmployee = null;

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

¿Cómo puedo seleccionar varias columnas? También quiero seleccionar res.ID. ¿Y cómo puedo recibirlos? IQueryable no funcionará, creo. Y esto se llama Linq to SQL, ¿verdad?

Riz
fuente
3
LinqToSql y el marco de la entidad son diferentes. Ver stackoverflow.com/questions/8676/…
gideon

Respuestas:

189

Como han indicado las otras respuestas, debe utilizar un tipo anónimo.

En lo que respecta a la sintaxis, personalmente prefiero el encadenamiento de métodos. El método de encadenamiento equivalente sería: -

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

AFAIK, la sintaxis declarativa LINQ se convierte en una cadena de llamadas a métodos similar a esta cuando se compila.

ACTUALIZAR

Si desea el objeto completo, solo tiene que omitir la llamada a Select(), es decir

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

Puede utilizar tipos anónimos, por ejemplo:

  var empData = from res in _db.EMPLOYEEs
                where res.EMAIL == givenInfo || res.USER_NAME == givenInfo
                select new { res.EMAIL, res.USER_NAME };
Ivan Danilov
fuente
¿Puede sugerir cómo escribir correctamente esta expresión: seleccione nuevo {(DateTime.Now - deuda.ClaimDate), deuda.Amount}; ? Lanza un error:
Declarador de
1
@DainiusKreivys select new { Diff = (DateTime.Now - debt.ClaimDate), Amount = debt.Amount}. El formulario utilizado en la respuesta es una abreviatura, donde el nombre del miembro en la expresión de inicialización se utiliza como un nombre de campo de tipo anónimo. Eg new {res.EMAIL, res.USER_NAME}es una abreviatura de new {EMAIL = res.EMAIL, USER_NAME = res.USER_NAME}. En caso de que haya una expresión, como en su caso con las fechas, la taquigrafía no se aplica, de ahí el error del compilador.
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 puedes usar

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

Explicacion:

  1. Seleccione empleado de la base de datos como res.

  2. Filtre los detalles del empleado según la condición where.

  3. Seleccione los campos obligatorios del objeto de empleado creando un objeto anónimo usando new {}

Bimzee
fuente
agregue una explicación en la respuesta.
Sandeep
¿Cómo accedes a las diferentes columnas?
ARidder101