Linq-Syntax - Auswahl mehrerer Spalten

96

Dies ist meine Linq-Syntax, die ich für mein Entitätsmodell verwende

IQueryable<string> objEmployee = null;

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

Wie kann ich mehrere Spalten auswählen? Als ob ich auch res.ID auswählen möchte. Und wie kann ich diese erhalten? IQueryable wird meiner Meinung nach nicht funktionieren. Und das nennt man Linq to SQL - richtig?

Riz
quelle
3
LinqToSql und Entity Framework unterscheiden sich. Siehe stackoverflow.com/questions/8676/…
Gideon

Antworten:

189

Wie aus den anderen Antworten hervorgeht, müssen Sie einen anonymen Typ verwenden.

Was die Syntax betrifft, bevorzuge ich persönlich die Verkettung von Methoden. Das Äquivalent zur Verkettung der Methode wäre:

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

AFAIK, die deklarative LINQ-Syntax wird beim Kompilieren in eine ähnliche Methodenaufrufkette konvertiert.

AKTUALISIEREN

Wenn Sie das gesamte Objekt möchten, müssen Sie nur den Aufruf von weglassen Select(), d. H.

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

Sie können anonyme Typen verwenden, zum Beispiel:

  var empData = from res in _db.EMPLOYEEs
                where res.EMAIL == givenInfo || res.USER_NAME == givenInfo
                select new { res.EMAIL, res.USER_NAME };
Ivan Danilov
quelle
Können Sie vorschlagen, wie dieser Ausdruck richtig geschrieben wird: Wählen Sie new {(DateTime.Now - Schulden.ClaimDate), Schulden.Amount}; ? Es wird ein Fehler ausgegeben: Ungültiger anonymer Typ-Mitgliedsdeklarator
Dainius Kreivys
1
@ DainiusKreivys select new { Diff = (DateTime.Now - debt.ClaimDate), Amount = debt.Amount}. Das in der Antwort verwendete Formular ist eine Kurzform, bei der der Mitgliedsname im Initialisierungsausdruck als Feldname vom anonymen Typ verwendet wird. ZB new {res.EMAIL, res.USER_NAME}ist eine Abkürzung für new {EMAIL = res.EMAIL, USER_NAME = res.USER_NAME}. Falls es einen Ausdruck gibt, wie in Ihrem Fall mit Datumsangaben, gilt die Kurzschrift nicht, daher ein Compilerfehler.
Ivan Danilov
5
 var employee =  (from res in _db.EMPLOYEEs
 where (res.EMAIL == givenInfo || res.USER_NAME == givenInfo)
 select new {res.EMAIL, res.USERNAME} );

ODER Sie können verwenden

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

Erklärung:

  1. Wählen Sie Mitarbeiter aus der Datenbank als res.

  2. Filtern Sie die Mitarbeiterdetails gemäß der Where-Bedingung.

  3. Wählen Sie die erforderlichen Felder aus dem Mitarbeiterobjekt aus, indem Sie mit new {} ein anonymes Objekt erstellen

Bimzee
quelle
Erklärung als Antwort hinzufügen.
Sandeep
Wie greifen Sie auf die verschiedenen Spalten zu?
ARidder101