2010-06-16 16 views
5

Nel codice, la parte commentata è ciò che devo risolvere ... Esiste un modo per scrivere tale query in LINQ? Ho bisogno di questo perché avrò bisogno di ordinare in base allo Status.LINQ - se condizione

var result = (
    from contact in db.Contacts 
    join user in db.Users on contact.CreatedByUserID equals user.UserID 
    join deal in db.Deals on contact.ContactID equals deal.ContactID into deals 
    orderby contact.ContactID descending 
    select new ContactListView 
    { 
     ContactID = contact.ContactID, 
     FirstName = contact.FirstName, 
     LastName = contact.LastName, 
     Email = contact.Email, 
     Deals = deals.Count(), 
     EstValue = deals.Sum(e => e.EstValue), 
     SalesAgent = user.FirstName + " " + user.LastName, 
     Tasks = 7, 
     // This is critical part 
     if(Deals == 0) Status = "Prospect"; 
     else 
      Status = "Client"; 
     // End of critical part... 
    }) 
    .OrderBy(filterQuery.OrderBy + " " + filterQuery.OrderType) 
    .Where(filterQuery.Status); 

risposta

10
Status = (deals.Count() == 0 ? "Prospect" : "Client") 

Questo utilizza la "Conditional operator"

L'operatore condizionale (? :) restituisce uno dei due valori a seconda del valore di un'espressione booleana.

Edit: È possibile effettuare combinazioni in questo modo:

Status = (deals.Count() == 0 ? "Prospect" : (deals.Count() == 1 ? "Client" : "Other")) 

In questo caso si sta usando deals.Count() molto, in modo da poter memorizzare il risultato in una variabile temporanea utilizzando la sintassi LINQ let :

var result = (
    from contact in db.Contacts 
    join user in db.Users on contact.CreatedByUserID equals user.UserID 
    join deal in db.Deals on contact.ContactID equals deal.ContactID into deals 
    let dealCount = deals.Count() 
    ... // Continue here 
    Status = (dealCount == 0 ? "Prospect" : (dealCount == 1 ? "Client" : "Other")) 
+0

, eccetto che deve essere deal.Count() invece di Deal. Cosa succede se ho più di due casi, c'è la possibilità di farlo? Grazie! –

+1

@ile - Assolutamente, devi solo usare una parentesi ... Status = (Deals.Count() == 0? "Nessuna offerta": (Deals.Count() == 1? "Un affare": "Molti offerte ")) –

+0

Vedo ... è davvero fantastico! Grazie! –

2
ar result = (
    from contact in db.Contacts 
    join user in db.Users on contact.CreatedByUserID equals user.UserID 
    join deal in db.Deals on contact.ContactID equals deal.ContactID into deals 
    orderby contact.ContactID descending 
    select new ContactListView 
    { 
     ContactID = contact.ContactID, 
     FirstName = contact.FirstName, 
     LastName = contact.LastName, 
     Email = contact.Email, 
     Deals = deals.Count(), 
     EstValue = deals.Sum(e => e.EstValue), 
     SalesAgent = user.FirstName + " " + user.LastName, 
     Tasks = 7, 
     // This is critical part 
     Status = deals.Count()==0 ? "Prospect" : "Client", 
     // End of critical part... 
    }) 
    .OrderBy(filterQuery.OrderBy + " " + filterQuery.OrderType) 
    .Where(filterQuery.Status); 
+1

'deals.Any()' sarebbe meglio :) – leppie

4
// This is critical part 
Status = deals.Any() ? "Client" : "Prospect" 
// End of critical part...