Składnia Linq - wybór wielu kolumn

97

To jest moja składnia Linq, której używam do mojego modelu jednostki

IQueryable<string> objEmployee = null;

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

Jak mogę wybrać wiele kolumn? Tak jak chcę również wybrać res.ID. Jak mogę je otrzymać? Myślę, że IQueryable nie zadziała. A to się nazywa Linq to SQL - prawda?

Riz
źródło
3
LinqToSql i struktura encji są różne. Zobacz stackoverflow.com/questions/8676/ ...
gideon

Odpowiedzi:

190

Jak wskazywały inne odpowiedzi, musisz użyć typu anonimowego.

Jeśli chodzi o składnię, osobiście zdecydowanie wolę łańcuchowanie metod. Równoważna metoda łączenia łańcuchowego byłaby następująca:

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

AFAIK, deklaratywna składnia LINQ jest konwertowana na łańcuch wywołań metody podobny do tego, gdy jest kompilowany.

AKTUALIZACJA

Jeśli chcesz mieć cały obiekt, wystarczy pominąć wywołanie Select()np

var employee = _db.EMPLOYEEs
    .Where(x => x.EMAIL == givenInfo || x.USER_NAME == givenInfo);
Adam Ralph
źródło
72

Możesz użyć anonimowych typów, na przykład:

  var empData = from res in _db.EMPLOYEEs
                where res.EMAIL == givenInfo || res.USER_NAME == givenInfo
                select new { res.EMAIL, res.USER_NAME };
Ivan Danilov
źródło
czy możesz zasugerować, jak poprawnie napisać to wyrażenie: select new {(DateTime.Now - dług.ClaimDate), dług.Kwota}; ? Zgłasza błąd: Nieprawidłowy deklarator członka typu anonimowego
Dainius Kreivys
1
@DainiusKreivys select new { Diff = (DateTime.Now - debt.ClaimDate), Amount = debt.Amount}. Forma użyta w odpowiedzi jest skrótem, w którym nazwa członka w wyrażeniu inicjującym jest używana jako nazwa pola typu anonimowego. Np. new {res.EMAIL, res.USER_NAME}To skrót od new {EMAIL = res.EMAIL, USER_NAME = res.USER_NAME}. W przypadku, gdy istnieje wyrażenie, jak w twoim przypadku z datami - skrót nie ma zastosowania, stąd błąd kompilatora.
Ivan Danilov
5
 var employee =  (from res in _db.EMPLOYEEs
 where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
 select new {res.EMAIL, res.USERNAME} );

LUB możesz użyć

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

Wyjaśnienie:

  1. Wybierz pracownika z bazy danych jako res.

  2. Filtruj dane pracownika zgodnie z warunkiem gdzie.

  3. Wybierz wymagane pola z obiektu pracownika, tworząc obiekt anonimowy przy użyciu nowego {}

Bimzee
źródło
dodaj wyjaśnienie w odpowiedzi.
Sandeep
Jak uzyskujesz dostęp do różnych kolumn?
ARidder101