J'ai eu le code Linq suivant:Comment utiliser Count et Group dans une requête de sélection dans Linq?
var allRequests = model.GetAllRequests();
var unsatisifedRequests = (from request in allRequests
where request.Satisfied == false
select request)
.OrderBy(r => r.RequestedOn)
.GroupBy(r => r.RequestedCountryId);
Après que je puis fait un foreach
sur unsatifiedRequests la construction d'un nouvel objet TOARequestListSummary pour chacun. Cela signifiait que si je "renvoyais" 4 éléments de la requête, cela ferait 4 appels au DB, une fois par boucle du foreach pour saisir les lignes individuelles.
Cela semble être la mauvaise façon d'utiliser LINQ, donc je tente de convertir cette requête à l'une qui a utilisé les projections pour retourner les TOARequestListSummary objets directement et je suis venu avec:
var summaries = (from request in allRequests
where request.Satisfied == false
group request by request.RequestedCountryId into requestGroups
select new TOARequestListSummary
{
CountryName = requestGroups.First().RequestedCountry.Description,
RequestCount = requestGroups.Count(),
FirstRequested = requestGroups.First().RequestedOn
});
Mais quand je lance ce, je reçois l'exception suivante:
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
J'ai aussi loin que de savoir que l'équivalent à Linq est EXISTE Contient, mais je ne sais pas comment cela indroducir dans la requête.
En fait, ce n'est pas tout à fait correct. Dans mon exemple, 'RequestedOn' est supposé être sur l'objet' RequestedCountry', alors que yours l'a sur 'request' lui-même. Y a-t-il une certaine manière que vous voulez déterminer le 'FirstRequested'? Si ce n'est pas le cas, vous pouvez utiliser 'requestGroups.First(). RequestedOn' comme vous l'avez dit plus haut. Si vous voulez le plus petit ou le plus grand (ou d'une autre manière), je peux faire des changements pour le corriger. –
RequestedOn est une colonne DateTime et j'essayais de les faire commander afin que ceux demandés en premier étaient en haut de la liste. Lorsque j'ai essayé le code dans votre réponse, il semble que g est une collection de Country obejcts (le type de RequestedCountry) donc .Requested sur ne compile pas. Lorsque j'ai essayé g.First(). Demandé, j'obtiens l'excpetion suivante: Le membre 'Logica.Aurora.Data.Entities.TOARequest.RequestedCountry' n'a aucune traduction prise en charge par SQL. Ce qui, je présume, signifie qu'il ne peut pas être groupé? –
Est-ce que 'RequestedCountry' est une propriété LinqToSql générée automatiquement à partir de vos relations de base de données? Donc, 'FirstRequested' devrait-il être le plus ancien' request' pour ce groupe, ou devrait-il être la date de la plus ancienne 'request'? –