2013-10-23 16 views
36

Vielleicht eine einfache Frage, aber kann es nicht leicht finden so verzeih mir =) Ich versuche, mehrere Spalten auszuwählen. Die Aussage, die ich verwende, ist:Wählen Sie mehrere Spalten mit Entity Framework

var dataset2 = from recordset in entities.processlists 
       where recordset.ProcessName == processname 
       select recordset.ServerName, recordset.ProcessID, recordset.Username; 

Offensichtlich kompiliert das nicht sogar. Was ist die korrekte Syntax? Ich habe auch versucht, Methode basiert, und selbst hart diese Syntax scheint richtig, wenn der Zugriff darauf wirft eine 'nicht in der Lage, den Typ' Anonymous Typ 'auf den Typ' AIM.PInfo 'zu werfen. LINQ to Entities unterstützt nur das Importieren von EDM-Primitiv- oder Aufzählungstypen. ' Ausnahme.

Irgendwelche Ideen?

var dataset = entities.processlists 
      .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart) 
      .Select(x => new { x.ServerName, x.ProcessID, x.Username }) 
      .Cast<PInfo>().ToList(); 
+0

Warum Sie eine neue anonyme erstellen müssen tun Art? Wäre es nicht das Beste, einfach nur Ihre Prozesslisten zu filtern und von jeder Entität direkt auf den Servernamen, die ProccessId und den Benutzernamen zuzugreifen? – Derek

Antwort

69

Tatsächlich weiß der Compiler nicht wissen, wie dieser anonymen Typen zu konvertieren (der new { x.ServerName, x.ProcessID, x.Username } Teil) zu einem pinfo Objekt.

var dataset = entities.processlists 
    .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart) 
    .Select(x => new { x.ServerName, x.ProcessID, x.Username }).ToList(); 

Dies gibt Ihnen eine Liste von Objekten (von anonymen Typ) können Sie anschließend verwenden, aber Sie können das nicht zurückkommen oder dass auf eine andere Methode übergeben.

Wenn Ihr pinfo Objekt die richtigen Eigenschaften hat, kann es so aussehen:

var dataset = entities.processlists 
    .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart) 
    .Select(x => new PInfo 
       { 
         ServerName = x.ServerName, 
         ProcessID = x.ProcessID, 
         UserName = x.Username 
       }).ToList(); 

Unter der Annahme, dass pinfo zumindest diese drei Eigenschaften aufweist.

Mit beiden Abfragen können Sie nur die gewünschten Spalten abrufen, aber mit einem vorhandenen Typ (wie in der zweiten Abfrage) können Sie diese Daten an andere Teile Ihrer App senden.

13

Sie an einen anonymen Typ auswählen können, zum Beispiel

var dataset2 = 
    (from recordset in entities.processlists 
    where recordset.ProcessName == processname 
    select new 
    { 
     serverName = recordset.ServerName, 
     processId = recordset.ProcessID, 
     username = recordset.Username 
    }).ToList(); 

Oder Sie können eine neue Klasse erstellen, die Ihre Auswahl zum Beispiel darstellen, Sie

public class MyDataSet 
{ 
    public string ServerName { get; set; } 
    public string ProcessId { get; set; } 
    public string Username { get; set; } 
} 

dann können für Beispiel:

var dataset2 = 
    (from recordset in entities.processlists 
    where recordset.ProcessName == processname 
    select new MyDataSet 
    { 
     ServerName = recordset.ServerName, 
     ProcessId = recordset.ProcessID, 
     Username = recordset.Username 
    }).ToList(); 
+0

Das zweite Beispiel hat wirklich gut funktioniert, vielen Dank. Ich hatte Leistungsprobleme, die durch jedes Objekt iterierten. Dies half mir, es einmal aus der Datenbank auszuwählen und den Rest im Code/Speicher zu erledigen. – riaandelange

3

entweder Sie wollen einen anonymen Typ wählen:

var dataset2 = from recordset 
       in entities.processlists 
       where recordset.ProcessName == processname 
       select new 
       { 
       recordset.ServerName, 
       recordset.ProcessID, 
       recordset.Username 
       }; 

Aber man kann nicht auf einen anderen Typ umgewandelt, so dass ich glaube, dass Sie so etwas wie dies wollen:

var dataset2 = from recordset 
       in entities.processlists 
       where recordset.ProcessName == processname 

       // Select new concrete type 
       select new PInfo 
       { 
       ServerName = recordset.ServerName, 
       ProcessID = recordset.ProcessID, 
       Username = recordset.Username 
       }; 
3

Warum Sie schaffen keine neue direkt im .Select Objekt:

.Select(x => new PInfo{ 
    ServerName = x.ServerName, 
    ProcessID = x.ProcessID, 
    UserName = x.Username }).ToList(); 
1
var test_obj = from d in repository.DbPricing 
join d1 in repository.DbOfficeProducts on d.OfficeProductId equals d1.Id 
join d2 in repository.DbOfficeProductDetails on d1.ProductDetailsId equals d2.Id 
    select new 
    { 
    PricingId = d.Id, 
    LetterColor = d2.LetterColor, 
    LetterPaperWeight = d2.LetterPaperWeight 
    }; 


http://www.cybertechquestions.com/select-across-multiple-tables-in-entity-framework-resulting-in-a-generic-iqueryable_222801.html 
0

Salam. Es richtige Weg ist Daten in der angegebenen Art zu erhalten:

var dataset = entities.processlists 
     .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart) 
     .Select(x => new { x.ServerName, x.ProcessID, x.Username }) 
     .ToList() /// To get data from database 
     .Select(x => new PInfo() 
       { 
        ServerName = x.ServerName, 
        ProcessID = x.ProcessID, 
        Username = x.Username 
       }); 

für weitere Informationen siehe: The entity cannot be constructed in a LINQ to Entities query

-1

Hier ist ein Codebeispiel:

var dataset = entities.processlists 
    .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart) 
    .Select(x => new PInfo 
       { 
         ServerName = x.ServerName, 
         ProcessID = x.ProcessID, 
         UserName = x.Username 
       }) AsEnumerable(). 
       Select(y => new PInfo 
       { 
        ServerName = y.ServerName, 
        ProcessID = y.ProcessID, 
        UserName = y.UserName 
       }).ToList(); 
Verwandte Themen