2010-06-16 30 views
5

Kodda, yorumlanması gereken kısım çözmem gereken şey ... LINQ'da böyle bir sorgu yazmanın bir yolu var mı? Buna ihtiyacım var çünkü Statü bazında sıralama ihtiyacım olacak.LINQ - koşul

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); 

cevap

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

Bu? :) ("Conditional operator"

koşullu operatör kullanan bir Boole ifadesinin değerine bağlı olarak iki değerden birini verir.

Düzenleme: Böyle kombinasyonlar yapabilirsiniz: senin) çok deals.Count( kullanıyor Bu durumda

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

, LINQ let sözdizimi kullanarak geçici bir değişkende sonucunu saklamak böylece :

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

, Deal yerine deals.Count() olması gerekmiyor. Ya ikiden fazla vakam varsa, bunu yapmak mümkün mü? Teşekkürler! –

+1

@ile - Kesinlikle, bazı parantezleri kullanmanız yeterli .. Durum = (Deals.Count() == 0? "Fırsat yok": (Deals.Count() == 1? "Tek anlaşma": "Birçok fırsatlar ")) –

+0

Görüyorum ... bu gerçekten harika! Teşekkürler! –

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()' daha iyi olurdu :) – leppie

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