Sintaxe Linq - Seleção de várias colunas

96

Esta é a minha sintaxe Linq que estou usando no meu modelo de entidade

IQueryable<string> objEmployee = null;

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

Como posso selecionar várias colunas? Como eu quero selecionar res.ID também. E como posso recebê-los? IQueryable não funcionará, eu acho. E isso é chamado de Linq para SQL - certo?

Riz
fonte
3
LinqToSql e estrutura de entidade são diferentes. Consulte stackoverflow.com/questions/8676/…
gideon

Respostas:

189

Como as outras respostas indicaram, você precisa usar um tipo anônimo.

No que diz respeito à sintaxe, eu pessoalmente prefiro o encadeamento de métodos. O equivalente de encadeamento de método seria: -

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

AFAIK, a sintaxe LINQ declarativa é convertida em uma cadeia de chamada de método semelhante a esta quando é compilada.

ATUALIZAR

Se você quiser o objeto inteiro, basta omitir a chamada para Select(), ou seja,

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

Você pode usar tipos anônimos, por exemplo:

  var empData = from res in _db.EMPLOYEEs
                where res.EMAIL == givenInfo || res.USER_NAME == givenInfo
                select new { res.EMAIL, res.USER_NAME };
Ivan Danilov
fonte
você pode sugerir como escrever essa expressão corretamente: selecione new {(DateTime.Now - debt.ClaimDate), debt.Amount}; ? Ele lança um erro:
Declarador de
1
@DainiusKreivys select new { Diff = (DateTime.Now - debt.ClaimDate), Amount = debt.Amount}. O formulário usado na resposta é uma abreviação, onde o nome do membro na expressão de inicialização é usado como um nome de campo do tipo anônimo. Por exemplo, new {res.EMAIL, res.USER_NAME}é uma abreviação de new {EMAIL = res.EMAIL, USER_NAME = res.USER_NAME}. No caso de haver uma expressão, como no seu caso com datas - abreviação não se aplica, portanto, erro de 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} );

OU você pode usar

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

Explicação:

  1. Selecione funcionário do banco de dados como res.

  2. Filtre os detalhes do funcionário de acordo com a condição where.

  3. Selecione os campos obrigatórios do objeto funcionário criando um objeto Anônimo usando novo {}

Bimzee
fonte
adicione explicação na resposta.
Sandeep
Como você acessa as diferentes colunas?
ARidder101