web-dev-qa-db-fra.com

Sélectionner plusieurs colonnes à l'aide d'Entity Framework

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

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

Évidemment, cela ne compile même pas. Quelle est la syntaxe correcte? J'ai également essayé la méthode, et même si cette syntaxe semble correcte, lorsque vous y accédez, le message 'Impossible de convertir le type' Type anonyme 'en type' AIM.PInfo '. LINQ to Entities ne prend en charge que le transtypage de types de primitive 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<PInfo>().ToList();
49
Ronald

En effet, le compilateur ne sait pas comment convertir ce type anonyme (la partie new { x.ServerName, x.ProcessID, x.Username }) en un objet 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'objets (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 objet PInfo a les bonnes propriétés, cela 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 ait au moins ces trois propriétés.

Les deux requêtes vous permettent d'extraire uniquement 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.

93
Réda Mattar

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 string ServerName { get; set; }
    public string ProcessId { get; set; }
    public string 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();
17
Andre Lombaard

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

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

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 utiliser ce type pour un autre type, alors je suppose que vous voulez quelque chose comme ceci:

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
CodeCaster

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

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
1
Ilker Eker