web-dev-qa-db-fra.com

obtenir le dernier dans la liste LINQ

Context db = new Context();
List<Invoice> invoice =
(from LocalInvoice in db.Invoices
where LocalInvoice.Site_Id == this.SiteIdentifier
select LocalInvoice).ToList();

Retourne une liste d'enregistrements. Je souhaite sélectionner le dernier élément de la liste. J'ai essayé .ToList().LastOrDefault(); , Mais le message d'erreur obtenu ne permet pas de convertir le type 'invoice' en 'System.Collections.Generic.List.

Pourquoi dit-on cela, je n'ai pas déclaré la facture sous forme de liste List<Invoice> invoice

Toute aide très appréciée. Ta


EDIT Merci à tous d'avoir répondu à cette question. J'ai essayé ce que vous avez tous conseillé et chaque fois que j'obtiens l'erreur: l'opérateur de requête 'LastOrDefault' n'est pas pris en charge.

Aussi Je n'ai pas vraiment expliqué ce que j'essaie de faire en général, ce qui peut poser un problème. J'ai un tableau contenant toutes les factures, chacune avec un «identifiant» séparé. Cependant, chaque enregistrement aura une colonne SiteIdentifier qui est utilisée plusieurs fois pour différentes factures. Ainsi, chaque site peut avoir plusieurs factures.

Essayer d'obtenir la facture la plus récente pour le site.

id SiteIdentifier 
73 25
74 25
75 25

J'essayais d'obtenir tous les enregistrements où SiteIdentifier == this.SiteIdentifier (par exemple, 25), puis le dernier enregistrement qui aurait été la facture id 75.

Quelqu'un a des idées? Encore merci pour toute l'aide

11
John

LastOrDefault renverra un seul élément. Vous ne devriez pas appeler ToList sans appliquer un filtre au préalable, il récupérerait toutes les lignes de la base de données pendant que vous en avez juste besoin.

var invoice = db.Invoices.LastOrDefault(s => s.Site_Id == this.SiteIdentifier);

Vous devez également appliquer la commande si vous interrogez une table relationnelle. LastOrDefault n'a de sens que pour les collections en mémoire. On dirait que ce n'est pas pris en charge dans EF et lèvera une exception.

La meilleure solution consiste à inverser le classement et à utiliser la méthode FirstOrDefault:

var invoice = db.Invoices.OrderByDescending(s => s.Id) 
                         .FirstOrDefault(s => s.Site_Id == this.SiteIdentifier);
23

LastOrDefault retournera une instance d'une facture, pas une collection, donc changez le type de variable.

Invoice invoice =
   (from LocalInvoice in db.Invoices
    where LocalInvoice.Site_Id == this.SiteIdentifier
    select LocalInvoice).LastOrDefault();

ou nettoyeur encore:

var invoice = db.Invoices.LastOrDefault(i => i.Site_Id == this.SiteIdentifier);
5
devdigital

LastOrDefault retournera un seul élément, pas un List. Cela fonctionnerait:

Invoice invoice =
    (from LocalInvoice in db.Invoices
     where LocalInvoice.Site_Id == this.SiteIdentifier
     select LocalInvoice)
    .LastOrDefault();
0
p.s.w.g