2010-06-16 38 views
5

Trong mã, phần nhận xét là những gì tôi cần phải giải quyết ... Có cách nào để viết truy vấn như vậy trong LINQ không? Tôi cần điều này vì tôi sẽ cần phân loại dựa trên Trạng thái.LINQ - nếu điều kiện

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

Trả lời

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

này sử dụng "Conditional operator"

Các nhà điều hành có điều kiện (? :) trả một trong hai giá trị tùy thuộc vào giá trị của một biểu thức Boolean.

Edit: Bạn có thể thực hiện kết hợp như thế này:

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

Trong trường hợp này bạn đang sử dụng deals.Count() rất nhiều, vì vậy bạn có thể lưu trữ kết quả trong một biến tạm thời sử dụng cú pháp 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

là nó, ngoại trừ nó phải được deals.Count() thay vì Deal. Nếu tôi có nhiều hơn hai trường hợp, có khả năng làm điều đó không? Cảm ơn! –

+1

@ile - Tuyệt đối, bạn chỉ cần sử dụng một số dấu ngoặc đơn .. Trạng thái = (Deals.Count() == 0? "Không có giao dịch": (Deals.Count() == 1? "Một giao dịch": "Nhiều giao dịch ")) –

+0

Tôi hiểu ... điều đó thực sự tuyệt vời! Cảm ơn! –

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()' sẽ tốt hơn :) – leppie

4
// This is critical part 
Status = deals.Any() ? "Client" : "Prospect" 
// End of critical part... 
Các vấn đề liên quan