2010-01-16 26 views
12

Tôi đã nhận lỗi này khi tôi sử dụng chức năng tổng hợp trong LINQ:lỗi LINQ tham số chung hoặc truy vấn phải sử dụng một loại nullable

The cast to value type 'Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => Content.Amount==null?0:Content.Amount), 
+0

Câu hỏi thực tế của bạn là gì? – AnthonyWJones

+0

Loại dữ liệu của thuộc tính Số tiền là gì? – AnthonyWJones

Trả lời

4

Bạn có thể loại trừ tại nguồn?

var sum = GroupProduct.Where(a => a.Product.ProductID==1 && a.Amount != null) 
      .Sum(a => (decimal)a.Amount); 
+0

Cảm ơn nhưng điều kiện rỗng là bắt buộc trên a.Product.ProductID == 1 .. – malik

+0

@malik - Tôi không hiểu; bạn có thể tái cụm từ nhận xét đó không? –

+0

Cảm ơn bạn lần nữa: Có hai điều. khi tôi sử dụng a.Product.ProductID đối tượng là null, tôi có thể kiểm tra nó trong truy vấn LINQ không. – malik

1

này trông như nó nên làm việc (và thường làm) nhưng thất bại khi ở đâu() phương pháp trả về null:

decimal sum1 = GroupProduct 
    .Where(a => a.Product.ProductID == 1) 
    .Sum(c => c.Amount ?? 0); 

Lỗi: "The cast to value type 'Decimal' failed because the materialized value is null" là do sự Sum (phương pháp) trả về null (không phải 0) khi tổng hợp trên một tập rỗng.

Một trong những công việc cho tôi:

decimal? sum2 = GroupProduct 
    .Where(a => a.Product.ProductID == 1) 
    .Sum(c => c.Amount); 

decimal sum3 = GroupProduct 
    .Where(a => a.Product.ProductID == 1) 
    .Sum(c => c.Amount) ?? 0; 
10

Bạn hãy thử như sau:

GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => (decimal?)Content.Amount) 

Mã từ ứng dụng của tôi trông giống như:

var data = query.AsEnumerable().Select(row => TaskInfo.FetchTaskInfo(row, 
     ctx.ObjectContext.Hours.Where(hour => hour.TaskId == row.TaskId).Sum(hour => (decimal?)hour.Duration), 
     ctx.ObjectContext.Notes.Count(note => note.SourceType == (int)SourceType.Task && note.SourceId == row.TaskId))); 
4

Hãy thử điều này:

var sum = GroupProduct.Where(a => a.Product.ProductID==1).Sum(Content => (int?) Content.Amount); 
sum = sum ?? 0; 
11

Đây là những gì tôi thường sử dụng. Điều này sẽ bao gồm khả năng của Amount là null và cũng bao gồm khả năng của một tập hợp sản phẩm nào.

GroupProduct.Where(a => a.Product.ProductID == 1) 
    .Select(c => c.Amount ?? 0) // select only the amount field 
    .DefaultIfEmpty() // if selection result is empty, return the default value 
    .Sum(c => c) 

DefaultIfEmpty() trả về giá trị mặc định gắn liền với loại Amount 's, đó là int, trong trường hợp giá trị mặc định là 0.

+0

@ Sнаđошƒаӽ: cảm ơn bạn đã sửa lỗi chính tả trong phản hồi của tôi. NHƯNG Tôi đặt lại toán tử kết hợp null. DefaultIfEmpty sẽ trả về một mục nhập 0 CHỈ NẾU bộ kết quả ban đầu trống, Nếu nó không trống nhưng Số tiền xảy ra với giá trị rỗng và có giá trị null thì sẽ thất bại nếu không có toán tử kết hợp rỗng. – mendel

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