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