Синтаксис Linq - выбор нескольких столбцов

97

Это мой синтаксис Linq, который я использую в своей модели объекта.

IQueryable<string> objEmployee = null;

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

Как выбрать несколько столбцов? Как я хочу также выбрать res.ID. И как их получить? Я думаю, что IQueryable работать не будет. И это называется Linq to SQL, верно?

Риз
источник
3
LinqToSql и структура сущности разные. См. Stackoverflow.com/questions/8676/…
gideon

Ответы:

191

Как указывали другие ответы, вам необходимо использовать анонимный тип.

Что касается синтаксиса, я лично предпочитаю цепочку методов. Эквивалент цепочки методов будет: -

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

AFAIK, декларативный синтаксис LINQ преобразуется в цепочку вызовов методов, аналогичную этой при компиляции.

ОБНОВИТЬ

Если вам нужен весь объект, вам просто нужно пропустить вызов Select(), т.е.

var employee = _db.EMPLOYEEs
    .Where(x => x.EMAIL == givenInfo || x.USER_NAME == givenInfo);
Адам Ральф
источник
72

Вы можете использовать анонимные типы, например:

  var empData = from res in _db.EMPLOYEEs
                where res.EMAIL == givenInfo || res.USER_NAME == givenInfo
                select new { res.EMAIL, res.USER_NAME };
Иван Данилов
источник
подскажите, как правильно написать это выражение: выберите новый {(DateTime.Now - duty.ClaimDate), duty.Amount}; ?
Выдает
1
@DainiusKreivys select new { Diff = (DateTime.Now - debt.ClaimDate), Amount = debt.Amount}. Форма, используемая в ответе, является сокращением, где имя члена в выражении инициализации используется как имя поля анонимного типа. Например new {res.EMAIL, res.USER_NAME}, это сокращение от new {EMAIL = res.EMAIL, USER_NAME = res.USER_NAME}. В случае, если есть выражение, как в вашем случае с датами, сокращение не применяется, следовательно, ошибка компилятора.
Иван Данилов
5
 var employee =  (from res in _db.EMPLOYEEs
 where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
 select new {res.EMAIL, res.USERNAME} );

ИЛИ вы можете использовать

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

Пояснение:

  1. Выберите сотрудника из базы данных как res.

  2. Отфильтруйте данные о сотруднике в соответствии с условием where.

  3. Выберите обязательные поля из объекта сотрудника, создав анонимный объект с помощью new {}

Бимзи
источник
добавить пояснение в ответ.
Сандип
Как получить доступ к различным столбцам?
ARidder101