2009-07-05 8 views
33

तो, मैं वे लोग जिनके आईडी आईडी की एक स्थानीय रूप से बनाया संग्रह के भीतर निहित है का एक संग्रह (IQueryable)LinqToSQls के आसपास काम कर रहे "स्थानीय संग्रह के साथ प्रश्नों समर्थित नहीं हैं" अपवाद

वापस जाने के लिए जब मैं "निर्दिष्ट कोशिश कर रहा हूँ स्थानीय रूप से निर्मित संग्रह ", मेरा मतलब है कि आईडी संग्रह एक LinqToSQL क्वेरी से नहीं आया है और प्रोग्रामेटिक रूप से बनाया गया है (उपयोगकर्ता इनपुट के आधार पर)। मेरे क्वेरी इस तरह दिखता है:

var qry = from p in DBContext.People 
        where Ids.Contains(p.ID) 
        select p.ID; 

यह निम्नलिखित अपवाद का कारण बनता है ...

"स्थानीय संग्रह के साथ प्रश्नों समर्थित नहीं हैं"

मैं एक आईडी के साथ सभी लोगों को कैसे मिल सकता है कि मेरे स्थानीय रूप से बनाए गए आईडी संग्रह में निहित है?

क्या यह LinqToSql का उपयोग करना संभव है?

उत्तर

34

यदि आईडी एक सूची, सरणी या समान है, तो L2S एक सूची में अनुवाद करेगा।

यदि आईडी एक IQueryable है, तो इसे क्वेरी में उपयोग करने से पहले इसे एक सूची में बदलें। उदा .:

List<int> listOfIDs = IDs.ToList(); 
var query = 
from st in dc.SomeTable 
where listOfIDs.Contains(st.ID) 
select ..... 
+2

मुझे लगता है कि आपकी समस्या का समाधान इस उत्तर से अधिक प्रचलित है। मैं एक ही निर्माण (एक WHQueryE खंड में एक IQueryable पर एक विधि शामिल है) सफलतापूर्वक उपयोग कर रहा हूं, और LINQ से SQL SQL SQL क्वेरी में WHERE EXISTS क्लॉज में इसका अनुवाद करता है। ऐसा लगता है कि कुछ स्थितियों में काम नहीं करता है, न कि दूसरों को, इसलिए आपको पोस्ट करना चाहिए कि आप अपने आईडी IQueryable कैसे प्राप्त करते हैं, क्योंकि इससे इस मुद्दे पर कुछ प्रकाश डाला जा सकता है। –

+1

@jmbledsoe अगर मेरा उत्तर पर्याप्त स्पष्ट नहीं था: एल 2 एस एक स्थानीय आईनेमरेबल (एक स्थगित IQueryable नहीं) की अपेक्षा करता है जो संख्यात्मक को पास करता है। यदि आप इसे एक स्थानीय क्वेरी पास करते हैं, जिसका अनुवाद SQL क्वेरी में नहीं किया जा सकता है। यदि आप इसे एक सूची/सरणी/आदि पास करते हैं तो इसका अनुवाद एसक्यूएल में किया जा सकता है "जहां ... में (x, y, ..., n)" खंड। – KristoferA

+2

मुझे लगता है कि मैं देख रहा हूं कि आप क्या कह रहे हैं: - एक सूची/ऐरे/आदि पास करना। ठीक है बी/सी यह एक जेनरेट करेगा ... खंड में। - एक स्थगित IQueryable पास करना ठीक है b/c यह वर्तमान स्थगित क्वेरी के साथ एकीकृत करेगा। - एक स्थानीय आईनेमरेबल पास करना ठीक नहीं है, लेकिन आप बस कर सकते हैं। कृपया() इसे और यह ठीक रहेगा। –

26

मैं भी इस समस्या से जूझ रहा था। किसी भी उपयोग करने के साथ मेरी समस्या हल() के बजाय

people.Where(x => ids.Any(id => id == x.ID)) 
+0

@maxlego और जेनरेट एसक्यूएल वंश है। धन्यवाद –

0

मैं माफी चाहता हूँ, लेकिन यहाँ उत्तर के रूप में मैं गतिशील प्रकार कर रहा हूँ और आगे भी साथ मेरे लिए काम नहीं किया।

मैंने जो किया वह लूप में "यूनियन" का उपयोग करना था जो महान काम करता है। यहां बताया गया है कि:

var firstID = cityList.First().id; 
var cities = dc.zs_Cities.Where(c => c.id == firstID); 
foreach(var c in cityList) 
{ 
    var tempCity = c; 
    cities = cities.Union(dc.zs_Cities.Where(cty => cty.id == tempCity.id)); 
} 
संबंधित मुद्दे