2010-06-16 4 views
5

В коде прокомментированная часть - это то, что мне нужно решить ... Есть ли способ написать такой запрос в LINQ? Мне нужно это, потому что мне потребуется сортировка на основе состояния.LINQ - если условие

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

ответ

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

Это использует "Conditional operator"

условный оператор (? :) возвращает одно из двух значений в зависимости от величины логическое выражение.

Edit: Вы можете сделать комбинации, как это:

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

В этом случае ваши использует deals.Count() много, так что вы можете сохранить результат во временном переменном с помощью синтаксиса 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

все, кроме того, что это должно быть deal.Count() вместо сделки. Что, если у меня будет более двух случаев, есть ли возможность сделать это? Спасибо! –

+1

@ile - Абсолютно, вам просто нужно использовать некоторую скобку .. Статус = (Deals.Count() == 0? "Нет сделок": (Deals.Count() == 1? "Одна сделка": "Многие сделок ")) –

+0

Я вижу ... это действительно здорово! Благодаря! –

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()' было бы лучше :) – leppie

4
// This is critical part 
Status = deals.Any() ? "Client" : "Prospect" 
// End of critical part... 
Смежные вопросы