2011-12-12 25 views
7

Çevrimiçi faturalandırma uygulamasında, müşterinin aldığı faturaların ve yapılan ödemelerin faturalandırma özeti verilir.Varlık veya karmaşık tür, LINQ - Varlıklar sorgusuna LINQ içinde yapılamaz

Bunun işe yaraması için önce ödemeleri çekip faturaları ile eşleştirmem gerekiyor.

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

Bu çalıyormuşuz, ancak hiçbir yaparsam yapayım, ben aşağıdaki hata iletisi alıyorum:

varlık veya karmaşık tip 'UtilityBill.Domain Yani böyle bir şey yapmasını .Concrete.BillSummary 'bir LINQ'ta Varlıklar sorgusuna yapılamaz.

Sorguların içinde sorguları çalıştırıyorum çünkü mi? Bu hatayı nasıl giderim?

Bir yanıt için Google'da arama yapmayı denedim ve birçok yanıtı görmeye çalıştım ancak bunların hiçbiri sorunumu açıklamıyor gibi görünüyor.

+0

olası yinelenen [varlık Varlıkları sorgusu LINQ inşa edilemez] (http://stackoverflow.com/questions/5325797/the-entity- – flipchart

cevap

6

Eşlenmiş bir varlık üzerine projeksiyon yapamazsınız. Eşlemenizi yapmadan önce ToList()'u aramanız gerekir.

Ya da daha iyisi, (sorgu çalıştırır arayarak FirstOrDefault ve size nesneyi doldurmak için izin verin) şu şekilde değiştirin:

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

İdare Framework kendinizi ayrıştırarak için ayrıca bir kullanarak düşünebilirsiniz Varlık Çerçeve modeli yerine döndürmek için farklı model sınıfı. Yaptığım sona erdi ne

+0

Bu, doğru cevabı tam olarak doğru olmasa da bana doğru yönde yönlendirdi. Sana kredi düşüncesi vermek istiyorum. –

+0

@MikeWills temsilcisi için teşekkürler! Sanırım kodunda neyin yanlış olduğunu ve nasıl düzeltileceğini gösterdim. – Craig

+1

@MikeWills, 'Where' ve sonra 'FirstOrDefault' çağrısının, ek SQL oluşmasına neden olacağına işaret eden düzenlememi sildim. Belki de bu önceki bir versiyonda bir problemdi çünkü bu kuralı uzun bir süredir takip ediyordum ... ya da belki de yanlış bir şeydi. – Craig

0

oldu:

 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(); 
     } 
ait
+0

Bence bu korkunç bir çözüm. Anonim türleri tanımlanmış varlık sınıflarına elle eşleme. Yine de seni yargılamıyorum ... Ben de Microsoft tarafından yağmurda bırakılmış gibi hissediyorum ... Bir ORM kullanmak istersiniz, ilişkisel veri ile varlık sınıfları arasındaki boşluğu doldurmak istersiniz. Burada olan bu değil. – ckonig