2011-12-12 31 views
7

在我們的在線計費應用程序中,我們給出了客戶收到的賬單以及他們付款的賬單摘要。實體或複雜類型不能在LINQ to Entities查詢中構造

爲了這個工作,我必須先支付款項,然後將它們與賬單相匹配。所以我做這樣的事情:

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); 
     } 
    } 
} 

我一直在玩這個,但是不管我做什麼,我得到了以下錯誤消息:

實體或複雜類型「UtilityBill.Domain .Concrete.BillSummary'不能在LINQ to Entities查詢中構建。

是因爲我在查詢中運行查詢嗎?我怎樣才能解決這個錯誤?

我曾試着在谷歌搜索一個答案,看到很多答案,但他們都沒有解釋我的問題。

+0

的可能重複[實體不能在LINQ被構造爲實體查詢](http://stackoverflow.com/questions/5325797/the-entity-不能被構建在一個LINQ實體查詢) – flipchart

回答

6

您無法投影到映射實體上。在進行映射之前,您必須先致電ToList()

或者更好的是,更改爲以下(調用FirstOrDefault將執行查詢,並允許您來填充對象):

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 
           }); 

要從實體框架脫鉤自己,你可能也想考慮使用不同的模型類返回而不是實體框架模型。

+0

這讓我在正確的方向,但不完全正確的答案。我想給你信用的想法。 –

+0

@MikeWills感謝代表!我想我已經指出了你的代碼出了什麼問題,以及如何解決它。 – Craig

+1

@MikeWills我刪除了我的編輯,它表示調用'Where'然後'FirstOrDefault'會導致生成額外的SQL,因爲看起來並非如此。也許這是早期版本中的一個問題,因爲我一直遵循這個規則很長一段時間......或者它可能只是錯誤的信息。 – Craig

0

我最終什麼事做的是:

 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

我認爲這是一個可怕的解決方案。手動將匿名類型映射到定義的實體類。儘管我並不認爲你......我也感覺像是在微軟的雨中......我想要使用ORM,你希望它填補關係數據和實體類之間的空白。這不是這裏發生的事情。 – ckonig

相關問題