Sélectionnez plusieurs colonnes à l’aide d’Entity Framework

Peut-être une question facile, mais ne le trouve pas facilement, alors pardonnez-moi =) J’essaie de sélectionner plusieurs colonnes. La déclaration que j’utilise est la suivante:

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

Evidemment, cela ne comstack même pas. Quelle est la syntaxe correcte? J’ai également essayé la méthode, et même si cette syntaxe semble correcte, en accédant à cette méthode, il est impossible de convertir le type ‘Anonymous type’ en ‘AIM.PInfo’. LINQ to Entities ne prend en charge que les types de primitives ou d’énumération EDM. ‘ exception.

Des idées?

 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().ToList(); 

En effet, le compilateur ne sait pas comment convertir ce type anonyme (la new { x.ServerName, x.ProcessID, x.Username } ) en un object PInfo.

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

Cela vous donne une liste d’objects (de type anonyme) que vous pouvez utiliser par la suite, mais vous ne pouvez pas les renvoyer ou les transmettre à une autre méthode.

Si votre object PInfo a les bonnes propriétés, il peut être comme ceci:

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

En supposant que PInfo a au moins ces trois propriétés.

Les deux requêtes vous permettent de ne récupérer que les colonnes souhaitées, mais l’utilisation d’un type existant (comme dans la seconde requête) vous permet d’envoyer ces données à d’autres parties de votre application.

Vous pouvez sélectionner un type anonyme, par exemple

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

Ou vous pouvez créer une nouvelle classe qui représentera votre sélection, par exemple

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

alors vous pouvez par exemple faire ce qui suit

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

Pourquoi ne créez-vous pas un nouvel object directement dans le .Select :

 .Select(x => new PInfo{ ServerName = x.ServerName, ProcessID = x.ProcessID, UserName = x.Username }).ToList(); 

Vous voulez soit sélectionner un type anonyme:

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

Mais vous ne pouvez pas le convertir en un autre type, alors je suppose que vous voulez quelque chose comme ça:

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

Salam. C’est la bonne façon d’obtenir des données dans le type spécifié:

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

pour plus d’informations, voir: L’entité ne peut pas être construite dans une requête LINQ to Entities

Voici un exemple de code:

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