2011-12-12 10 views
7

हमारे ऑनलाइन बिलिंग एप्लिकेशन पर नहीं किया जा सकता है, हम ग्राहक के बिलों और उनके द्वारा किए गए भुगतानों का बिलिंग सारांश देते हैं।इकाई या जटिल प्रकार का निर्माण LINQ से 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 से Entities क्वेरी में नहीं बनाया जा सकता है।

क्या ऐसा इसलिए है क्योंकि मैं प्रश्नों के भीतर प्रश्न पूछ रहा हूं? मैं इस त्रुटि के आसपास कैसे हो सकता है?

मैंने Google को एक उत्तर के लिए खोज करने की कोशिश की है और कई उत्तरों देखे हैं, लेकिन उनमें से कोई भी मेरी समस्या को समझाने के लिए प्रतीत नहीं होता है।

+0

के संभावित डुप्लिकेट [इकाई संस्थाओं क्वेरी के लिए एक LINQ का निर्माण नहीं किया जा सकता] (http://stackoverflow.com/questions/5325797/the-entity- इन-ए-लिनक-टू-एंटिटी-क्वेरी में नहीं बनाया जा सकता है) – flipchart

उत्तर

6

आप मैप किए गए इकाई पर प्रोजेक्ट नहीं कर सकते हैं। अपने मैपिंग करने से पहले आपको ToList() पर कॉल करना होगा।

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

इकाई की रूपरेखा से अपने आप को दसगुणा करने के लिए आप भी एक का उपयोग कर विचार कर सकते हैं:

या बेहतर अभी तक, निम्नलिखित के लिए बदल (बुला FirstOrDefault क्वेरी को निष्पादित करेंगे और आप अपने वस्तु को भरने के लिए अनुमति देते हैं) इकाई फ्रेमवर्क मॉडल के बजाय अलग-अलग मॉडल क्लास लौटने के लिए।

+0

यह मुझे सही दिशा में मिला हालांकि पूरी तरह से सही जवाब नहीं है। मैं आपको क्रेडिट विचार देना चाहता हूं। –

+0

@ माइकविल्स प्रतिनिधि के लिए धन्यवाद! मुझे लगता है कि मैंने बताया कि आपके कोड में क्या गलत था और इसे कैसे ठीक किया जाए। – Craig

+1

@ माइकविल्स मैंने अपना संपादन हटा दिया जो इंगित करता है कि 'कहां' और फिर 'फर्स्टऑर्ड डीफॉल्ट' को कॉल करने से अतिरिक्त एसक्यूएल उत्पन्न हो जाएगा क्योंकि यह मामला प्रतीत नहीं होता है। शायद यह पहले के संस्करण में एक समस्या थी क्योंकि मैं इस नियम का पालन कुछ समय से कर रहा हूं ... या शायद यह सिर्फ गलत जानकारी थी। – 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

मुझे लगता है कि यह एक भयानक समाधान है। परिभाषित इकाई वर्गों के लिए मैन्युअल रूप से अनाम प्रकार मैपिंग। हालांकि आप का न्याय नहीं कर रहा है ... मुझे भी माइक्रोसॉफ्ट द्वारा बारिश में छोड़ना पसंद है ... मैं आप एक ओआरएम का उपयोग करना चाहता हूं, आप चाहते हैं कि यह संबंधपरक डेटा और इकाई वर्गों के बीच अंतर को भरें। यह नहीं हो रहा है कि यहाँ क्या हो रहा है। – ckonig

संबंधित मुद्दे