2009-01-14 22 views
32

Có thể sử dụng Nếu người khác có điều kiện trong truy vấn LINQ không?Nếu người khác trong LINQ

Something như

from p in db.products 
if p.price>0 
select new 
{ 
    Owner=from q in db.Users 
     select q.Name 
} 
else 
select new 
{ 
    Owner = from r in db.ExternalUsers 
      select r.Name 
} 

Trả lời

51

Điều này có thể làm việc ...

from p in db.products 
    select new 
    { 
     Owner = (p.price > 0 ? 
      from q in db.Users select q.Name : 
      from r in db.ExternalUsers select r.Name) 
    } 
+2

Sẽ rất thú vị để xem nếu mà làm việc ... nếu nó không, tôi rất muốn nhìn thấy TSQL (giả sử nó tải háo hức, vì tải chậm, có lẽ không quá khủng khiếp). –

+1

Điều này sẽ hoạt động. "?:" Được dịch sang biểu thức "chữ hoa" và có các truy vấn phụ. –

+1

Không nên. Nó được tốt đẹp để có xác nhận rằng điều này không hoạt động. Rất hữu ích nếu có. –

7

tôi giả từ db rằng đây là LINQ-to-SQL/Entity Framework/tương tự (không LINQ-to-Objects);

Nói chung, bạn làm tốt hơn với cú pháp có điều kiện (a? B: c) - tuy nhiên, tôi không biết nếu nó sẽ làm việc với các truy vấn khác nhau của bạn như vậy (sau khi tất cả, làm thế nào bạn sẽ viết TSQL?) .

Đối với một ví dụ tầm thường của loại điều bạn có thể làm:

select new {p.PriceID, Type = p.Price > 0 ? "debit" : "credit" }; 

Bạn có thể làm những điều phong phú hơn nhiều, nhưng tôi thực sự nghi ngờ bạn có thể chọn bảng trong điều kiện. Bạn hãy khám phá, tất nhiên ...

3

trả lời ở trên là không phù hợp với biểu hiện LINQ phức tạp. Tất cả bạn cần là:

// set up the "main query" 
var test = from p in _db.test select _db.test; 
// if str1 is not null, add a where-condition 
if(str1 != null) 
{ 
    test = test.Where(p => p.test == str); 
} 
1

bạn nên thay đổi như thế này:

private string getValue(float price) 
{ 
    if(price >0) 
     return "debit"; 
    return "credit"; 
} 

//Get value like this 
select new {p.PriceID, Type = getValue(p.Price)}; 
1

ví dụ của tôi:

companyNamesFirst = this.model.CustomerDisplayList.Where(a => a.CompanyFirst != null ? a.CompanyFirst.StartsWith(typedChars.ToLower())) : false).Select(b => b.CompanyFirst).Distinct().ToList(); 
Các vấn đề liên quan