2013-08-02 15 views
8

मैं linq और इकाई ढांचे के लिए बेहद नया हूं। मैं एक समस्या को हल करने की कोशिश कर रहा हूं कि नीचे क्यों काम नहीं कर रहा है। उत्पादित त्रुटि "अज्ञात प्रकार 'प्रकार का निरंतर मान बनाने में असमर्थ है। इस संदर्भ में केवल प्राचीन प्रकार या गणना प्रकार समर्थित हैं।"'अज्ञात प्रकार' प्रकार का निरंतर मान बनाने में असमर्थ। इस संदर्भ में केवल प्राचीन प्रकार या गणना प्रकार समर्थित हैं

मैं इस इतने सारे अलग अलग तरीकों से अभी तक अभी भी आदिम प्रकार से संबंधित कोई त्रुटि मिलती है की कोशिश की है। अगर कोई नीचे दिए गए कोड को देख सकता है और उम्मीद है कि यह कहां गलत हो रहा है, तो मैं इसकी बहुत सराहना करता हूं।

 public Entities.BikeData[] GetBikesWithExpiredSyncDeadline(int noOfDays) { 

     using (OfficeEntities cxt = GetContext()) 
     using (ReportingEntities RepCxt = GetReportingContext()) { 
      Data.Repository.Abstract.IBikeRepository BikeRepos = new Data.Repository.Concrete.BikeRepository();     

      var details = (from sd in cxt.BikeDetails 
             where sd.autoreminder == true 
              && (sd.lastremindersent == null || sd.lastremindersent < EntityFunctions.AddDays(DateTime.UtcNow, noOfDays * -1)) 
              && (sd.emailaddress != null && sd.emailaddress.Trim() != "") 
             select new { 
              Serial = sd.Serial, 
              EmailAddress = sd.emailaddress 
             }).ToList(); 

      var resLst = (from r in RepCxt.RegisteredBikes 
          join d in details on r.Serial equals d.Serial 
          join cs in cxt.CompanySettings.ToList() on r.CompanyID equals cs.CompanyID 
          where (!r.lastupdate.HasValue || r.lastupdate < EntityFunctions.AddDays(DateTime.UtcNow, cs.AutoNotificationFrequency * -1)) 
          select new Entities.BikeData { 
           ID = r.ID, 
           Name = r.Ship, 
           Serial = r.Serial, 
           LastUpdate = r.lastupdate, 
           DaysSinceLastSync = (r.lastupdate.HasValue? EntityFunctions.DiffDays(r.lastupdate.Value, DateTime.UtcNow).Value : -1), 
           EmailAddress = (d.EmailAddress == null ? string.Empty : (String.IsNullOrEmpty(d.EmailAddress) ? r.ShipEmailAddress : d.EmailAddress)) 
          }); 

      return resLst.ToArray(); 
     } 
    } 

अद्यतन

मैं एक दृश्य बना कर अब इस के साथ एक अलग दृष्टिकोण लिया है तो मैं अब और नहीं पार संदर्भ एफई में मिलती है क्या करने की जरूरत। मैं उम्मीद कर रहा था कि आप नीचे से मदद करने में सक्षम हो सकते हैं।

जब मैं objectQuery.ToTraceString() चलाता हूं तो यह मुझे वैध एसक्यूएल प्रदान करता है जो डीबी में रिकॉर्ड देता है, हालांकि एंटीटीफ्रेमवर्क में reslst हमेशा 0 के साथ आता है। क्या यह स्पष्ट हो रहा है कि यह क्यों हो रहा है?

var resLst = (from ls in cxt.BikeLastUpdates 
          where (!ls.lastupdate.HasValue || ls.lastupdate < EntityFunctions.AddDays(DateTime.UtcNow, ls.AutoNotificationFrequency * -1)) 
          && (ls.autoreminder ==true) 
          && (ls.lastremindersent == null || ls.lastremindersent < EntityFunctions.AddDays(DateTime.UtcNow, 3 * -1)) 
          && (ls.emailaddress !=null && ls.emailaddress.Trim() != "") 
          select new Entities.BikeData{ 
           ID = (ls.ID ?? new Guid()), 
           Name = ls.Bike, 
           Serial = ls.Serial, 
           LastUpdate = ls.lastupdate, 
           EmailAddress = (String.IsNullOrEmpty(ls.emailaddress) ? ls.ShipEmailAddress : ls.emailaddress) 
          }); 

      var objectQuery = resLst as ObjectQuery; 

      return resLst.ToArray(); 
+0

मैं [Sql सर्वर प्रोफाइलर] (HTT का उपयोग कर की सिफारिश करेंगे पी: //msdn.microsoft.com/en-us/library/ms181091.aspx) और उस एसक्यूएल को कैप्चर करना जो ईएफ वास्तव में सर्वर को भेज रहा है। –

+0

चीयर्स साथी। मूर्ख कनेक्शन स्ट्रिंग मुद्दा। आप रहते हैं और सीखते हैं :-) – JIbber4568

उत्तर

5

समस्या विवरण पर ToList() कॉल है। ईएफ में, आप केवल क्वेरी के अंदर एक आईनेमरेबल को संदर्भित कर सकते हैं यदि वह IENumerable एक साधारण प्रकार (ई। जी। Int) है। हालांकि, आप एक और IQueryable का उल्लेख कर सकते हैं। इस प्रकार, ToList() कॉल को छोड़ना यह काम करना चाहिए।

संपादित करें: इसी तरह, आप ctx.CompanySettings पर ToList() कॉल ड्रॉप चाहिए।

SELECT ... 
FROM RegisteredBikes rb 
JOIN (
    /* this is your "details" IQueryable */ 
    SELECT Serial, EmailAddress 
    FROM BikeDetails 
    WHERE ... 
) bd 
    ON rb.Serial = b.Serial 
JOIN CompanySettings cs 
    ON ... 
WHERE ... 

संपादित करें: आप विवरण पर ToList() हो जाते हैं

इस 2. के बजाय केवल 1 क्वेरी को क्रियान्वित करने का एक अतिरिक्त लाभ होगा, एफई की तरह कुछ उत्पन्न होगा संदर्भों के पार ऐसा करने के लिए, आप स्मृति में क्वेरी (AsEnumerable (फोन करके जैसे) लाने के लिए और प्रासंगिक वहाँ मिलती है। मिलती फिल्टर के रूप में कार्य करते हैं करने की आवश्यकता होगी और यह महत्वपूर्ण इन एसक्यूएल में होना के लिए, का उपयोग कर शामिल हैं() पर विचार नहीं है। उदाहरण के लिए

var serials = details.Select(d => d.Serial); 
var filtered = RepCtxt.RegisteredBikes.Where(r => details.Contains(r.Serial); 
अपने अद्यतन के लिए
+0

इसके लिए धन्यवाद। ऐसा करने का कारण यह है कि हमें पार संदर्भ में शामिल होना है। जहां तक ​​मुझे बिना पता है। टोस्टिस्ट() हम क्रॉस संदर्भ पूछने में असमर्थ हैं। क्या इसके साथ कोई अलग दृष्टिकोण है, मुझे शायद क्रॉस संदर्भ में शामिल होने की अनुमति देनी चाहिए? क्रॉस-रेफरेंस में शामिल होने के लिए – JIbber4568

+0

@ JIbber4568, आपको पूरी कंपनी सेटिंग्स तालिका को मेमोरी में खींचने और एक WHERE IN() (ईएफ में शामिल) का उपयोग करके फ़िल्टर करने की आवश्यकता होगी। – ChaseMedallion

+0

इसके साथ आपकी मदद के लिए धन्यवाद। मैंने इसके साथ थोड़ा अलग दृष्टिकोण लिया है लेकिन अब डीबी से परिणामों को विरासत में प्राप्त करने वाले एंटिटी फ्रेमवर्क में समस्याएं आ रही हैं। क्या उपरोक्त अद्यतन में कुछ भी स्पष्ट है जो इसका कारण हो सकता है? धन्यवाद – JIbber4568

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