2012-02-22 15 views
6

Ho la seguente tabella:LINQ ottenere il valore massimo dalla lista

ID Amt Received 
-- ---- -------- 
2 55 N 
2 88 Y 
2 44 N 
3 5 N 
3 9 N 
4 5 N 
5 33 Y 
6 43 N 
7 54 N 

    var result = (from rs in db.Exp 
        where rs.ID == id 
        && rs.Received == true 
        select rs).Max().Any(); 

Dato un ID, ho bisogno di trovare il massimo Amt per un dato id e quindi verificare se è Y, in caso affermativo, restituisce true altrimenti restituisci falso.

risposta

18

Questo dovrebbe farlo;

db.Exp. 
    Where(x => x.ID == id). 
    OrderByDescending(x => x.Amt). 
    Take(1). 
    Any(x => x.Received == "Y"); 
+0

Bello. Sospetto che l'ultima parte dovrebbe in realtà essere 'x => x.Received', ma mi piace il modo in cui questo gestisce i risultati vuoti. –

+0

@Joachim Isaksson - Mi piace la soluzione. Devo aggiungere un'altra condizione a. Any (x => x.Received == "Y" && x => x.Division == "Accounting") ma non mi permette di farlo. Qualche idea sul perché. Nota che la divisione non è nella tabella sopra. Ho dimenticato di includerlo –

+0

@NatePet Devi solo includere 'x =>' una volta in un lambda, quindi dovrebbe essere '.Any (x => x.Received ==" Y "&& x.Division ==" Contabilità ")' –

3

Hai bisogno di dirgli quello che vuoi il Max di.

var result = 
    (from rs in db.Exp 
    where rs.ID == id && rs.Received 
    select rs) 
    .Max(row => row.Amt) == Y; 

E non è necessario il .Any() affatto

0
// "I need to find the max Amt for a given id..." 
var elementWithMaxAmount = 
    db.Exp 
    .Where(x => x.ID == id) 
    .OrderByDescending(x => x.Amount) 
    .FirstOrDefault(); 

// "... and then check if it is Y" 
var result = (elementWithMaxAmount != null && 
       elementWithMaxAmount.Received == "Y"); 
6

Purtroppo LINQ non fornisce un "max da un attributo" metodo. MoreLINQ fa con il suo operatore MaxBy, ma questo non può essere tradotto in SQL, ovviamente. Quindi, se questa è una query LINQ to SQL (o qualsiasi altra cosa), avrai bisogno di un approccio diverso. Se è già LINQ to Objects, però:

return db.Exp.Where(rs => rs.ID == id) 
      .MaxBy(rs => rs.Amt) 
      .Received; 

Si noti che questo sta facendo quello che le parole della tua domanda chiedono:

  • Fuori dei record con il dato id ...
  • trovare quello con l'importo più elevato ...
  • e verificare il valore di Received

Questo è non lo stesso:

  • Fuori i record con l'ID data in cui ha ricevuto è vero ...
  • trovare quello con l'importo più elevato

noti inoltre che questo genererà un'eccezione se ci sono no record con quell'ID.

Se si vuole farlo in LINQ to SQL, ecc, si sarebbe probabilmente meglio fuori con un ordinamento:

var highest = db.Exp.Where(rs => rs.ID == id) 
        .OrderByDescending(rs => rs.Amt) 
        .FirstOrDefault(); 
return highest != null && highest.Received; 

È non lo fanno vuole fare questo se si sta utilizzando LINQ agli oggetti, in quanto ordinerà tutti i risultati, quando si desidera solo trovare il risultato con l'importo più alto.

+0

Jon, come faresti in C# linq? (da rs in db ....) –

+0

@NatePet: Intendi in un'espressione di query? Quale pezzo di codice? Fondamentalmente non esiste il supporto per le espressioni di query per 'FirstOrDefault()' (e ovviamente non per 'MaxBy') quindi dovresti mettere tra parentesi l'espressione della query per chiamare i metodi alla fine - e la tua proiezione sarebbe un no -operazione. Fondamentalmente sarebbe più brutto. È * sicuramente * degno di stare bene con entrambe le forme. –

Problemi correlati