2012-11-15 9 views
49

मेरे आवेदन में मेरे पास व्याख्याता है और उनके पास पाठ्यक्रमों की सूची है जो वे पढ़ सकते हैं और जब मैं एक कोर्स हटा रहा हूं, तो मैं व्याख्याताओं से कनेक्शन हटाना चाहता हूं। यहां कोड है:LINQ, XXX प्रकार का निरंतर मान बनाने में असमर्थ। इस संदर्भ में केवल प्राचीन प्रकार या गणना प्रकार समर्थित हैं

public void RemoveCourse(int courseId) 
{ 
    using (var db = new AcademicTimetableDbContext()) 
    { 
     var courseFromDb = db.Courses.Find(courseId); 

     var toRemove = db.Lecturers 
         .Where(l => l.Courses.Contains(courseFromDb)).ToList(); 

     foreach (var lecturer in toRemove) 
     { 
      lecturer.Courses.Remove(courseFromDb); 
     } 

     db.SaveChanges(); 
    } 
} 

लेकिन यह काम नहीं करता है। मुझे

NotSupportedException: Course प्रकार का निरंतर मान बनाने में असमर्थ। इस संदर्भ में केवल प्राचीन प्रकार या गणना प्रकार समर्थित हैं।

मैं क्या गलत कर रहा हूं?

+0

'व्याख्याता' और 'कोर्स' के बीच किस तरह का रिश्ता है? क्या यह 1-टू-एन या एन-टू-एन है? – GolfWolf

+0

संबंधित: [इस संदर्भ में केवल प्राचीन प्रकार या गणना प्रकारों का निरंतर मान बनाने में असमर्थ] [http://stackoverflow.com/q/18929483/456814)। –

+0

संबंधित: [निरंतर मान बनाने में असमर्थ - केवल आदिम प्रकार] (http://stackoverflow.com/q/10862491/456814)। –

उत्तर

70

आप गैर-आदिम मूल्यों के साथ Contains का उपयोग नहीं कर सकते हैं।

Where(l => l.Courses.Select(c => c.CourseId).Contains(courseId) 

(या आपके द्वारा उपयोग किए जाने वाले आईडी फ़ील्ड)।

+1

धन्यवाद, यह काम करता है;) – pawel1708hp

+0

ग्रेट उत्तर @ gert-arnold! मुझे यहां एक ही त्रुटि संदेश के साथ नेतृत्व किया गया था, लेकिन मैं शामिल विधि के बजाय गणना मूल्य के साथ 'जॉइन' का उपयोग कर रहा था। इस मामले में, मुझे केवल शामिल होने से पहले संदर्भ परिणामों की गणना करने की आवश्यकता थी। –

5

आप एक DbContext का उपयोग कर रहे हैं, तो आप .local संग्रह क्वेरी कर सकता है, और == ऑपरेटर वस्तुओं के साथ भी काम करेगा:

public void RemoveCourse(int courseId) 
{ 
    using (var db = new AcademicTimetableDbContext()) 
    { 
     var courseFromDb = db.Courses.Find(courseId); 

     db.Lecturers.Load() //this is optional, it may take some time in the first load 

     //Add .Local to this line 
     var toRemove = db.Lecturers.Local 
         .Where(l => l.Courses.Contains(courseFromDb)).ToList(); 

     foreach (var lecturer in toRemove) 
     { 
      lecturer.Courses.Remove(courseFromDb); 
     } 

     db.SaveChanges(); 
    } 
} 

.local एक ObservableCollection, आप कुछ भी आप तुलना कर सकते हैं इसलिए है इसके अंदर (एसक्यूएल प्रश्नों तक सीमित नहीं है जो ऑब्जेक्ट तुलना का समर्थन नहीं करते हैं)। बस यह सुनिश्चित करने के लिए कि आप अपनी सभी ऑब्जेक्ट्स को प्राप्त करें। लोकल संग्रह आप कॉल करने से पहले db.Lecturers.Load() विधि को कॉल कर सकते हैं .लोकल, जो सभी डेटाबेस प्रविष्टियों को स्थानीय संग्रह में लाता है।

0

Courses नीचे पंक्ति का संग्रह शून्य या खाली होना चाहिए।

var toRemove = db.Lecturers 
         .Where(l => l.Courses.Contains(courseFromDb)).ToList(); 
संबंधित मुद्दे