Сущность или сложный тип не могут быть созданы в запросе LINQ to Entities - PullRequest
7 голосов
/ 12 декабря 2011

В нашем онлайн-приложении для выставления счетов мы даем сводную информацию о том, какие счета получил клиент и какие платежи он сделал.

Для того, чтобы это работало, я должен сначала вытащить платежи, а затем сопоставить их со счетами. Поэтому я должен сделать что-то вроде:

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.

Это потому, что я выполняю запросы внутри запросов? Как я могу обойти эту ошибку?

Я пытался найти в Google ответ и вижу много ответов, но ни один из них не объясняет мою проблему.

Ответы [ 2 ]

6 голосов
/ 12 декабря 2011

Вы не можете проецировать на сопоставленную сущность. Вы должны были бы позвонить 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
                               });

Чтобы отделить себя от Entity Framework, вы можете также рассмотреть возможность использования другого класса модели для возврата вместо модели Entity Framework.

0 голосов
/ 12 декабря 2011

То, что я закончил, было:

        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();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...