2012-04-18 44 views
5

Tôi có LINQ truy vấn sau đâyĐối tượng dễ vỡ phải có giá trị - tại sao?

from p in dc.Purchases 
where invoiceNumber == null || p.InvNumber == invoiceNumber.Value 
select p; 

Các 'INVOICENUMBER' là một int nullable - khi đó là null, chương trình ném một 'đối tượng Nullable phải có một lỗi giá trị'. Tại sao điều này khi nó kiểm tra rõ ràng nếu nó là null đầu tiên? Có cách nào để giái quyết vấn đề này không?

Cảm ơn,

+3

Có sự khác biệt nào khi bạn thay đổi séc trống thành 'invoiceNumber.HasValue' không? –

+0

Nhà cung cấp Linq nào bạn đang sử dụng? LINQ to sql, khung thực thể, LINQ cho đối tượng ...? – AakashM

+0

LINQ to SQL. Không có sự khác biệt khi sử dụng HasValue – Chris

Trả lời

0

thử điều này:

from p in dc.Purchases 
where invoiceNumber == null ||(invoiceNumber!=null && p.InvNumber == invoiceNumber.Value) 
select p; 
+2

không có ý nghĩa - || toán tử sẽ đánh giá đối số thứ hai của nó chỉ khi đối số thứ nhất đánh giá sai – Bond

0

Kiểm tra này một

from p in dc.Purchases 
where (invoiceNumber == null ? p.InvNumber == null : p.InvNumber == invoiceNumber.Value) 
select p; 
0

gì về

from p in dc.Purchases 
where (invoiceNumber ?? p.InvNumber) == p.InvNumber 
select p; 

nhưng, tôi sẽ đặt ra câu hỏi, nếu invoiceNumbernull tại sao chạy câu lệnh này?

+0

Nếu nó là null, nó sẽ truy xuất mọi thứ – Chris

+0

@Chris, do đó, một câu lệnh khác không có mệnh đề where sẽ hiệu quả hơn cho cơ sở dữ liệu của bạn thực thi. – Jodrell

0

Sử dụng thuộc tính HasValue để kiểm tra xem giá trị Nullable có giá trị hay không.

from p in dc.Purchases 
where !invoiceNumber.HasValue || p.InvNumber == invoiceNumber.Value 
select p; 
0

Bạn không biết, nhưng tôi nghi ngờ rằng p.InvNumber cũng không thể thực hiện được. Trong trường hợp đó, không sử dụng số .Value:

from p in dc.Purchases 
where invoiceNumber == null || p.InvNumber == invoiceNumber 
select p; 
0

bạn không cần phải kiểm tra rỗng một cách rõ ràng. có thể có hai trường hợp với các giá trị nullable hoặc nó sẽ là null hoặc có một số giá trị.

ví dụ:

TRƯỜNG HỢP 1-

int ? invoiceNumber = null; 
var prods = from p in dc.Purchases 
      where p.InvNumber == invoiceNumber 
      select p; 

TRƯỜNG HỢP 2-

int ? invoiceNumber = 100; 
var prods = from p in dc.Purchases 
      where p.InvNumber == invoiceNumber 
      select p; 

cùng tuyên bố LINQ sẽ làm việc trong cả hai trường hợp.

+0

Tại sao trường hợp 1 có mệnh đề where? – Jodrell

+0

Tôi chỉ muốn mô tả rằng cùng một truy vấn LINQ sẽ làm việc trong cả hai trường hợp. hoặc invoiceNumber là null hoặc nó có một số giá trị. – userGS

0

Khái niệm cơ bản về loại nullable là ... loại cơ bản sẽ có tất cả các giá trị được chỉ định trong phạm vi của nó + a null giá trị, để tăng tính linh hoạt với lập trình cơ sở dữ liệu.

loại nullable có hai thuộc tính readonly 1) HasValue 2) Value

HasValueboolean loại và nó được thiết lập là true tự động nếu giá trị gia tăng có một số giá trị trong đó. Vì vậy, để so sánh, bạn phải sử dụng HasValue trước và sau đó Value. Nếu bạn sử dụng trực tiếp Value và nếu đó là null, thì ngoại lệ trên sẽ bị ném.

ghi nhớ điều này, tôi cũng nghi ngờ đoạn này.nơi invoiceNumber == null bạn nên thử invoiceNumber.Value==null (không INVOICENUMBER)

hoặc

where invoiceNumber.HasValue && p.InvNumber == invoiceNumber.Value 

nhờ

0

Vấn đề có thể trong LINQ-to-SQL - nó cố gắng để chuyển đổi nơi tuyên bố to SQL để INVOICENUMBER. Giá trị có thể được gọi ngay cả khi nó là null.

Hãy thử xem invoiceNumber == null || p.InvNumber == invoiceNumber ở đâu.

Hy vọng nó sẽ hữu ích.

2

Tôi nghĩ có sự cố với truy vấn của bạn. Từ mã bạn đã cung cấp, tôi giả sử rằng invoiceNumber là biến cục bộ hoặc tham số. Nếu đây là trường hợp, thì tại sao bạn thậm chí còn kiểm tra xem invoiceNumber == null trong truy vấn của mình? Việc kiểm tra như vậy phải được thực hiện riêng biệt với truy vấn:

if(invoiceNumber == null) 
{ 
    return dc.Purchases; 
    // the query would evaluate to this because invoiceNumber == null will allways return true. 
} 
else 
{ 
    return 
     from p in dc.Purchases 
     where p.InvNumber == invoiceNumber.Value 
     select p; 
} 
Các vấn đề liên quan