2011-12-12 11 views
7

W naszej internetowej aplikacji do fakturowania podajemy podsumowanie płatności za rachunki otrzymane przez klienta i dokonane przez niego płatności.Podmiotu lub typu złożonego nie można skonstruować w zapytaniu LINQ do encji

Aby to zadziałało, muszę najpierw wyciągnąć płatności, a następnie dopasować je do rachunków. Więc mam coś takiego:

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

Gram z tym, ale nie wiem co mam zrobić, pojawia się następujący komunikat o błędzie:

jednostki lub typu złożonego „UtilityBill.Domain .Concrete.BillSummary 'nie można skonstruować w kwerendzie LINQ to Entities.

Czy to dlatego, że korzystam z zapytań w ramach zapytań? Jak mogę obejść ten błąd?

Próbowałem wyszukać w Google odpowiedź i zobaczyć wiele odpowiedzi, ale żaden z nich nie wyjaśnia problemu.

+0

możliwe duplikat [Podmiot nie może być wykonana w LINQ podmiotom zapytania] (http://stackoverflow.com/questions/5325797/the-entity- nie można skonstruować-w-a-linq-to-entity-query) – flipchart

Odpowiedz

6

Nie można rzutować na zmapowany obiekt. Zanim wykonasz mapowanie, musisz zadzwonić pod numer ToList().

Albo jeszcze lepiej, zmieni się na następujący (wywołanie FirstOrDefault wykona zapytanie i pozwalają zapełnić obiekt):

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

oddzielić siebie od Entity Framework może warto również rozważyć użycie inna klasa modelu do zwrócenia zamiast modelu Entity Framework.

+0

To doprowadziło mnie do właściwego kierunku, choć nie do końca jest właściwą odpowiedzią. Chcę dać ci myśl o kredycie. –

+0

@MikeWills dzięki za rep! Myślę, że wskazałem, co było nie tak z twoim kodem i jak to naprawić. – Craig

+1

@MikeWills usunąłem moją edycję, która wskazała, że ​​wywołanie 'Where', a następnie' FirstOrDefault' spowodowałoby wygenerowanie dodatkowego kodu SQL, ponieważ wygląda na to, że tak nie jest. Może to był problem we wcześniejszej wersji, ponieważ od dawna przestrzegam tej zasady ... a może to była tylko dezinformacja. – Craig

0

Co skończyło się robi było:

 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

Myślę, że to straszne rozwiązanie. Odwzorowywanie typów anonimowych ręcznie na zdefiniowane klasy jednostek. Nie sądzę jednak, że ... Ja też czuję się jak zostawiony w deszczu przez Microsoft ... Chcę użyć ORM, chcesz, żeby wypełniał lukę między danymi relacyjnymi a klasami jednostek. To nie jest to, co się tutaj dzieje. – ckonig

Powiązane problemy