इस प्रकार के निरंतर मूल्य बनाने में असमर्थ केवल इस संदर्भ में आदिम प्रकार या गणना प्रकार समर्थित हैं


164

नीचे दी गई क्वेरी के लिए मुझे यह त्रुटि मिल रही है

प्रकार का निरंतर मान बनाने में असमर्थ API.Models.PersonProtocol। इस संदर्भ में केवल आदिम प्रकार या गणना प्रकार समर्थित हैं

ppCombinedनीचे एक IEnumerableवस्तु है PersonProtocolType, जो 2 PersonProtocolसूचियों के समतल द्वारा निर्मित है ।

यह असफल क्यों हो रहा है? हम एक के JOINअंदर LINQ क्लॉज का उपयोग नहीं कर सकते ?SELECTJOIN

var persons = db.Favorites
    .Where(x => x.userId == userId)
    .Join(db.Person, x => x.personId, y => y.personId, (x, y) =>
        new PersonDTO
        {
            personId = y.personId,
            addressId = y.addressId,                   
            favoriteId = x.favoriteId,
            personProtocol = (ICollection<PersonProtocol>) ppCombined
                .Where(a => a.personId == x.personId)
                .Select( b => new PersonProtocol()
                 {
                     personProtocolId = b.personProtocolId,
                     activateDt = b.activateDt,
                     personId = b.personId
                 })
        });


जवाबों:


232

यह काम नहीं कर सकता क्योंकि ppCombinedस्मृति में वस्तुओं का एक संग्रह है और आप डेटाबेस में डेटा का एक सेट जो स्मृति में है, के साथ अन्य डेटा में शामिल नहीं हो सकते। आप फ़िल्टर किए गए आइटम को निकालने के लिए बजाय कोशिश कर सकते हैं personProtocolकी ppCombinedस्मृति में संग्रह के बाद आप डेटाबेस से अन्य संपत्तियों को लिया गया है:

var persons = db.Favorites
    .Where(f => f.userId == userId)
    .Join(db.Person, f => f.personId, p => p.personId, (f, p) =>
        new // anonymous object
        {
            personId = p.personId,
            addressId = p.addressId,   
            favoriteId = f.favoriteId,
        })
    .AsEnumerable() // database query ends here, the rest is a query in memory
    .Select(x =>
        new PersonDTO
        {
            personId = x.personId,
            addressId = x.addressId,   
            favoriteId = x.favoriteId,
            personProtocol = ppCombined
                .Where(p => p.personId == x.personId)
                .Select(p => new PersonProtocol
                {
                    personProtocolId = p.personProtocolId,
                    activateDt = p.activateDt,
                    personId = p.personId
                })
                .ToList()
        });

10
मेरे लिए मुख्य भाग जोड़ रहा था। asEnererable () // डेटाबेस क्वेरी यहाँ समाप्त होती है, बाकी मेमोरी में एक क्वेरी है
समीर अलीभाई

2
@Slauma तो अगर मैं प्रदर्शन के बारे में चिंतित हूं तो मुझे इसे करने से बचना चाहिए क्योंकि यह पहले मेमोरी में सभी डेटा को लोड करेगा और फिर इसे क्वेरी करेगा। क्या मुझे इस परिदृश्य के लिए कच्चे sql लिखना चाहिए?
अरविंद

ऐसा लगता है जैसे @Arvand एक महान बिंदु है। यदि आपके पास फ़िल्टर से पहले बड़ी संख्या में रिकॉर्ड हैं, तो यह उपलब्ध मेमोरी संसाधनों में से एक बहुत बड़ा हिस्सा ले सकता है।
अप्रैल को स्पैडाइव्स

5
@Slauma "यह काम नहीं कर सकता क्योंकि ppCombined स्मृति में वस्तुओं का एक संग्रह है और आप डेटाबेस में डेटा के एक सेट के साथ डेटा के एक सेट में शामिल नहीं हो सकते जो स्मृति में है।" मुझे इस तरह की चीजों के बारे में प्रलेखन कहां मिल सकता है? मुझे वास्तव में EF की सीमाओं का ज्ञान नहीं है, और जब मैं किसी क्वेरी के परिणाम को इस तरह से प्रतिबंधित करने का प्रयास करता हूं, तो यह अक्षमता स्वयं बहुत स्पष्ट हो जाती है और मुझे धीमा कर देती है।
नोमनेटर

1
अच्छी जानकारी। मैं इस अपवाद को अपनी कम से कम सहज अपवाद संदेशों की सूची में शामिल कर रहा हूं। यह केवल समझ में आता है कि आप समझ रहे हैं कि ऐसा क्यों हो रहा है।
DVK

2

अगर किसी को इसके लिए खोज करता है पता नहीं है। मुझे भी यही समस्या थी। क्वेरी पर सेलेक्ट करें और फिर जहाँ (या ज्वाइन) करें और सिलेक्टेड वैरिएबल का उपयोग करके मेरे लिए समस्या का समाधान करें। (समस्या मेरे लिए "Reintegraties" संग्रह में थी)

query.Select(zv => new
            {
                zv,
                rId = zv.this.Reintegraties.FirstOrDefault().Id
            })
            .Where(x => !db.Taken.Any(t => t.HoortBijEntiteitId == x.rId
                                             && t.HoortBijEntiteitType == EntiteitType.Reintegratie
                                             && t.Type == TaakType))
            .Select(x => x.zv);

आशा है कि यह किसी को भी मदद करता है।


6
zv.this.Reintegraties.FirstOrDefault().Idसंभावित NullReferenceException

2

मेरे मामले में, मैं निम्नलिखित काम करके इस मुद्दे को हल करने में सक्षम था:

मैंने इससे अपना कोड बदल दिया:

var r2 = db.Instances.Where(x => x.Player1 == inputViewModel.InstanceList.FirstOrDefault().Player2 && x.Player2 == inputViewModel.InstanceList.FirstOrDefault().Player1).ToList();

इसके लिए:

var p1 = inputViewModel.InstanceList.FirstOrDefault().Player1;
var p2 = inputViewModel.InstanceList.FirstOrDefault().Player2;
var r1 = db.Instances.Where(x => x.Player1 == p1 && x.Player2 == p2).ToList();

यह मेरे लिए काम नहीं करता है। जैसे ही p1और p2दोनों मेमोरी में होते हैं चाहे वे गुमनाम रूप से घोषित किए जाते हैं या एक चर नाम से।
रहमत ज़मां

2
चर प्रकार समस्या नहीं है। मेरे मामले में त्रुटि उत्पन्न हुई थी, क्योंकि जहां एक खंड के अंदर एक .FirstOrDefault () कर रहा था।
कॉलिन

2

यह जोड़ने योग्य है, क्योंकि ओपी का कोड नमूना अन्यथा साबित करने के लिए पर्याप्त संदर्भ प्रदान नहीं करता है, लेकिन मुझे यह त्रुटि निम्न कोड पर भी मिली है:

public RetailSale GetByRefersToRetailSaleId(Int32 refersToRetailSaleId)
{
    return GetQueryable()
        .FirstOrDefault(x => x.RefersToRetailSaleId.Equals(refersToRetailSaleId));
}

जाहिर है, मैं Int32.Equalsइस संदर्भ में एक आदिम इंट के साथ एक इंट 32 की तुलना करने के लिए उपयोग नहीं कर सकता ; मुझे इसे (सुरक्षित रूप से) बदलना पड़ा:

public RetailSale GetByRefersToRetailSaleId(Int32 refersToRetailSaleId)
{
    return GetQueryable()
      .FirstOrDefault(x => x.RefersToRetailSaleId == refersToRetailSaleId);
}

ईएफ Equalsपूरी तरह से अच्छी तरह से स्वीकार करता है।
गर्ट अर्नोल्ड

0

बस AsEnumerable () औरToList () जोड़ें, इसलिए यह इस तरह दिखता है

db.Favorites
    .Where(x => x.userId == userId)
    .Join(db.Person, x => x.personId, y => y.personId, (x, y).ToList().AsEnumerable()

ToList().AsEnumerable()

0

मेरे पास यह मुद्दा था और मैंने क्या किया और समस्या को हल किया जो मैंने AsEnumerable()अपने जॉइन क्लॉज से ठीक पहले इस्तेमाल किया था । यहाँ मेरी क्वेरी है:

List<AccountViewModel> selectedAccounts;

 using (ctx = SmallContext.GetInstance()) {
                var data = ctx.Transactions.
                    Include(x => x.Source).
                    Include(x => x.Relation).
                    AsEnumerable().
                    Join(selectedAccounts, x => x.Source.Id, y => y.Id, (x, y) => x).
                    GroupBy(x => new { Id = x.Relation.Id, Name = x.Relation.Name }).
                    ToList();
            }

मैं सोच रहा था कि यह समस्या क्यों होती है, और अब मुझे लगता है कि यह इसलिए है क्योंकि आप LINQ के माध्यम से एक प्रश्न बनाते हैं , परिणाम स्मृति में होगा और वस्तुओं में लोड नहीं किया जाएगा, मुझे नहीं पता कि वह स्थिति क्या है लेकिन वे कुछ में हैं संक्रमणकालीन स्थिति मुझे लगता है। फिर जब आप उपयोग करते हैं AsEnumerable()या ToList()आदि, आप उन्हें भौतिक मेमोरी ऑब्जेक्ट में डाल रहे हैं और समस्या हल हो रही है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.