2011-12-12 36 views
7

Trên ứng dụng thanh toán trực tuyến của chúng tôi, chúng tôi cung cấp bản tóm tắt thanh toán hóa đơn mà khách hàng đã nhận và các khoản thanh toán mà họ đã thực hiện.Không thể xây dựng thực thể hoặc loại phức tạp trong truy vấn LINQ to Entities

Để làm việc này, trước tiên tôi phải rút các khoản thanh toán rồi khớp chúng với hóa đơn. Vì vậy, tôi đã làm điều gì đó như:

foreach (BillPaymentSummary payment in billPayments) 
{ 
    DateTime dt = payment.DueDate; 

    // Debug errors on this next line 
    var summary = (from a in db.BillHistories 
        where a.CustomerId == customerNumber && a.DueDate == dt && a.Type == "BILL" 
        select new BillSummary 
        { 
         Id = a.Id, 
         CustomerId = a.CustomerId, 
         DueDate = a.DueDate, 
         PreviousBalance = a.PreviousBalance.Value, 
         TotalBill = a.TotalBill.Value, 
         Type = a.Type, 
         IsFinalBill = a.IsFinalBill 
        }).SingleOrDefault(); 

    if (summary != null) 
    { 
     summary.PayDate = payment.PaidDate; 
     summary.AmountPaid = payment.AmountPaid; 
     returnSummaries.Add(summary); 
    } 
    else 
    { 
     summary = (from a in db.BillHistories 
        where a.CustomerId == customerNumber && a.DueDate == payment.DueDate && a.Type == "ADJ " 
        select new BillSummary 
        { 
         Id = a.Id, 
         CustomerId = a.CustomerId, 
         DueDate = a.DueDate, 
         PreviousBalance = a.PreviousBalance.Value, 
         TotalBill = a.TotalBill.Value, 
         Type = a.Type, 
         IsFinalBill = a.IsFinalBill 
        }).SingleOrDefault(); 

     if (summary != null) 
     { 
      summary.PayDate = payment.PaidDate; 
      summary.AmountPaid = payment.AmountPaid; 
      returnSummaries.Add(summary); 
     } 
    } 
} 

Tôi đã được chơi với điều này, nhưng không có vấn đề gì tôi làm, tôi nhận được thông báo lỗi sau:

Thực thể hoặc loại phức tạp 'UtilityBill.Domain .Concrete.BillSummary 'không thể được xây dựng trong một truy vấn LINQ to Entities.

Có phải vì tôi đang chạy truy vấn trong các truy vấn không? Làm thế nào tôi có thể nhận được xung quanh lỗi này?

Tôi đã thử tìm kiếm câu trả lời của Google và thấy nhiều câu trả lời nhưng không có câu trả lời nào trong số đó có vẻ giải thích được sự cố của tôi.

+0

thể trùng lặp của [Thực thể không thể được xây dựng trong một truy vấn LINQ to Entities] (http://stackoverflow.com/questions/5325797/the-entity- không thể-được-xây dựng-trong-một-linq-to-thực thể-truy vấn) – flipchart

Trả lời

6

Bạn không thể chiếu lên thực thể được ánh xạ. Bạn sẽ phải gọi ToList() trước khi thực hiện ánh xạ.

Hoặc tốt hơn, thay đổi như sau (FirstOrDefault gọi sẽ thực hiện truy vấn và cho phép bạn để cư đối tượng của bạn):

var summary = db.BillHistories.FirstOrDefault(a => a.CustomerId == customerNumber && a.DueDate == dt && a.Type == "BILL").Select(x => new BillSummary 
           { 
            Id = a.Id, 
            CustomerId = a.CustomerId, 
            DueDate = a.DueDate, 
            PreviousBalance = a.PreviousBalance.Value, 
            TotalBill = a.TotalBill.Value, 
            Type = a.Type, 
            IsFinalBill = a.IsFinalBill 
           }); 

Để tách mình khỏi khung Entity bạn có thể muốn cũng xem xét sử dụng một lớp mô hình khác nhau để trả về thay vì mô hình khung thực thể.

+0

Điều này đã cho tôi đi đúng hướng mặc dù không hoàn toàn câu trả lời đúng. Tôi muốn cung cấp cho bạn suy nghĩ tín dụng. –

+0

@MikeWills cảm ơn vì đại diện! Tôi nghĩ rằng tôi đã chỉ ra những gì đã sai với mã của bạn và làm thế nào để sửa chữa nó mặc dù. – Craig

+1

@MikeWills tôi đã xóa bản chỉnh sửa của mình cho biết rằng việc gọi 'Where' và sau đó 'FirstOrDefault' sẽ khiến SQL bổ sung được tạo ra vì nó không xuất hiện như vậy. Có lẽ đây là một vấn đề trong một phiên bản trước đó bởi vì tôi đã tuân theo quy tắc này trong một thời gian ... hoặc có lẽ đó chỉ là thông tin sai lạc. – Craig

0

Những gì tôi đã kết thúc làm là:

 foreach (BillPaymentSummary payment in billPayments) 
     { 
      var data = db.BillHistories.Where(b => b.CustomerId == customerNumber && b.DueDate == payment.DueDate && b.Type == "B").FirstOrDefault(); 

      if (data != null) // There is a bill history 
      { 
       returnSummaries.Add(new BillSummary 
       { 
        Id = data.Id, 
        CustomerId = data.CustomerId, 
        DueDate = data.DueDate, 
        PreviousBalance = data.PreviousBalance, 
        TotalBill = data.TotalBill, 
        Type = (data.Type.Trim() == "B" ? "BILL" : (data.Type == "A" ? "ADJ" : "")), 
        IsFinalBill = data.IsFinalBill, 
        PayDate = payment.PaidDate, 
        AmountPaid = payment.AmountPaid 
       }); 
      } 
      else // No bill history record, look for an adjustment 
      { 
       data = db.BillHistories.FirstOrDefault(b => b.CustomerId == customerNumber && b.DueDate == payment.DueDate && b.Type == "A"); 

       if (data != null) 
       { 
        returnSummaries.Add(new BillSummary 
        { 
         Id = data.Id, 
         CustomerId = data.CustomerId, 
         DueDate = data.DueDate, 
         PreviousBalance = data.PreviousBalance, 
         TotalBill = data.TotalBill, 
         Type = (data.Type.Trim() == "B" ? "BILL" : (data.Type == "A" ? "ADJ" : "")), 
         IsFinalBill = data.IsFinalBill, 
         PayDate = payment.PaidDate, 
         AmountPaid = payment.AmountPaid 
        }); 
       } 
      } 
      db.SaveChanges(); 
     } 
+0

Tôi nghĩ đó là một giải pháp khủng khiếp. Lập bản đồ các loại ẩn danh theo cách thủ công cho các lớp thực thể được xác định. Không phán xét bạn mặc dù ... Tôi cũng cảm thấy như bị mưa trong trái của Microsoft ... Tôi muốn sử dụng ORM, bạn muốn nó lấp đầy khoảng trống giữa dữ liệu quan hệ và các lớp thực thể. Đây không phải là những gì đang xảy ra ở đây. – ckonig

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