2009-12-06 38 views
5

Dưới đây là một chút LinqToSql Gotcha:phím tắt có điều kiện trong LinqToSql truy vấn

// Returns the number of counties in a state, 
// or all counties in the USA if the state is null 
public static int CountCounties(State s) { 
    var q = 
    from cy in County.GetTable() // my method to get the ITable 
    where (s == null || s.Code == cy.StateCode) // shortcut OR operator, right...? 
    select cy; 
    return q.Count(); 
} 

Đoán những gì - nếu bạn vượt qua một đối tượng null State để phương pháp này, bạn sẽ có được một ngoại lệ tham chiếu null! Có vẻ như LinqToSql không sử dụng toán tử tắt || làm lối tắt!

Trả lời tín dụng cho bất kỳ ai đề xuất giải thích tốt nhất & giải pháp cho việc này.

+0

Đây có phải là LinqToSql không? –

+0

Trong LINQ 'bình thường', một truy vấn tương tự phù hợp với tôi. –

+0

Vâng, đó là LinqToSql - xin lỗi, sẽ chỉnh sửa câu hỏi –

Trả lời

6

Nếu đó là LINQ to sql thì hãy nhớ rằng LINQ đang phân tích cú pháp truy vấn của bạn vào SQL.

Do đó, gửi cả hai mệnh đề của bạn vào cơ sở dữ liệu, do đó ngoại lệ. Tôi không thấy điều này thực sự đáng ngạc nhiên, mặc dù nó được cho là sai.

Bạn sẽ chỉ phải thực hiện kiểm tra độc lập.

if (!string.isNullOrEmpty(state.statecode) 
    q = q.where(s => s.code == state.statecode 
+0

+1 Tôi thích ý tưởng thêm vào truy vấn bằng lambda. –

3

Điều này không liên quan đến LINQ nói chung. Trong trường hợp này, nhà cung cấp LINQ to SQL cố gắng phân tích cú pháp biểu thức lambda của bạn và biến nó thành truy vấn TSQL. Nó không thể đưa ra quá nhiều giả định dựa trên biểu thức của bạn vì nó cố gắng ủy thác hầu hết công việc cho cơ sở dữ liệu.

Câu chuyện dài ngắn, nhà cung cấp chỉ đơn giản là không thể dịch nó sang SQL.

Các vấn đề liên quan