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?


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);

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 };

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 {}


adicione explicação na resposta.
Sandeep

Como você acessa as diferentes colunas?
ARidder101
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.