2009-09-18 33 views
7

Làm thế nào tôi sẽ viết một cái gì đó như thế này trong LINQ to EntitiesLINQ Nếu Bản Tuyên Bố

sb.Append(" WHERE question.question_isdeleted = 0"); 
    if (catid != 0) 
     sb.AppendFormat(" AND (CatID IN ({0}))", catsSTR); 
    if(!string.IsNullOrEmpty(AuthorID)) 
     sb.Append(" AND (question_ownerid = @id)"); 

tôi nghĩ rằng tôi chỉ cần cú pháp viết một nếu có điều kiện trong LINQ to Entities

Trả lời

14

Tôi sẽ sử dụng ký hiệu dấu chấm ở đây:

var query = questions.Where(q => !q.IsDeleted); 

if (catId != 0) 
{ 
    query = query.Where(q => cats.Contains(q.CatID)); 
} 
if (authorId != 0) 
{ 
    query = query.Where(q => q.OwnerId == authorId); 
} 

bạn có thể viết phương pháp khuyến nông của riêng bạn để làm điều này hơi đơn giản hơn:

public static IQueryable<T> OptionalWhere<T>(
    this IQueryable<T> source, 
    bool condition, 
    Expression<Func<T,bool>> predicate) 
{ 
    return condition ? source.Where(predicate) : source; 
} 

Sau đó, bạn có thể viết:

var query = questions.Where(q => !q.IsDeleted); 
        .OptionalWhere(catId != 0, q => cats.Contains(q.CatID)) 
        .OptionalWhere(authorId != 0, q => q.OwnerId == authorId); 
+0

Jon, thích phương thức mở rộng OptionalWhere. Hoàn toàn tuyệt vời :)/tôi đánh cắp bạch kim đó nugget ... –

+0

hey đó là một số mã tuyệt vời ... đẹp – user161433

-1
where question.question_isdeleted = 0 
    && (catid != 0 
    ? catsStr.Contains(CatId.ToString()) 
    : question_ownerId == id) 

Không chắc chắn nếu các hoạt động chuỗi là chính xác, nhưng logic có vẻ đúng.

+0

Điều đó sẽ gây LINQ to Entities để thử và dịch toàn bộ câu lệnh SQL, trong đó sẽ không có ý nghĩa nếu 'catid' xa lạ với cơ sở dữ liệu. Một vấn đề nữa với câu trả lời này là nó sẽ thêm một mệnh đề where * hoặc * vào 'catsStr' * hoặc *' question_ownerId'. Đó không phải là những gì được yêu cầu. –

+1

Các biến trong LINQ to Entities trở thành các tham số trong SQL, vì vậy nó hợp pháp để sử dụng catId tại đây. –

0

Bạn có điều kiện có thể xây dựng một truy vấn như thế này:

var query = from q in questions 
      where q.question_isdeleted 
      select q; 
if(!string.IsNullOrEmpty(AuthorID)) 
{ 
    query = from q in query 
      where q.question_ownerid == AuthorID 
      select q; 
} 

Tuy nhiên, LINQ to Entities không có cấu trúc tốt mà tương tự như SQL TRÊN điều hành ...