ধরণের ধ্রুবক মান তৈরি করতে অক্ষম এই প্রসঙ্গে কেবল আদিম প্রকার বা গণনা প্রকারগুলি সমর্থিত


164

নীচের প্রশ্নের জন্য আমি এই ত্রুটিটি পাচ্ছি

ধরণের ধ্রুবক মান তৈরি করতে অক্ষম API.Models.PersonProtocol। এই প্রসঙ্গে কেবল আদিম ধরণের বা গণনার প্রকারগুলি সমর্থিত

ppCombinedনীচে একটি IEnumerableঅবজেক্ট রয়েছে PersonProtocolType, যা 2 PersonProtocolতালিকার উপসংহারে নির্মিত ।

কেন এটা ব্যর্থ হচ্ছে? আমরা LINQ ব্যবহার করা যাবে না JOINধারা ভিতরে SELECTএকটি এর JOIN?

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
আমার জন্য মূল অংশটি যুক্ত হচ্ছিল sআসামযোগ্য () // ডাটাবেস কোয়েরিটি এখানেই শেষ হয়, বাকি স্মৃতিতে একটি প্রশ্ন
সমীর আলিভাই

2
@ স্লুমা সুতরাং আমি যদি পারফরম্যান্স সম্পর্কে উদ্বিগ্ন তবে আমার এটি করা এড়ানো উচিত কারণ এটি প্রথমে মেমরিতে সমস্ত ডেটা লোড করে তারপরে এটি অনুসন্ধান করে। এই পরিস্থিতিগুলির জন্য আমার কি কাঁচা স্ক্যাকল লেখা উচিত?
অরবন্দ

দেখে মনে হচ্ছে @ আরভান্ডের একটি দুর্দান্ত বিষয় রয়েছে। ফিল্টারটির আগে যদি আপনার প্রচুর রেকর্ড থাকে তবে এটি উপলব্ধ মেমোরি সংস্থান থেকে একটি বিশাল দংশন নিতে পারে।
স্প্যাডিলিভস

5
@ স্লুমা "এটি কাজ করতে পারে না কারণ পিপিকোবাইন্ড হ'ল মেমরির বস্তুগুলির সংগ্রহ এবং আপনি মেমরিতে থাকা ডেটার একটি সেট দিয়ে ডাটাবেসে ডেটা সংকলনে যোগ দিতে পারবেন না।" এই জাতীয় জিনিস সম্পর্কে আমি কোথায় ডকুমেন্টেশন পেতে পারি? আমি সত্যিই EF এর সীমা সম্পর্কে জ্ঞান অভাব বোধ করছি এবং যখন আমি কোনও প্রশ্নের ফলাফলকে এভাবে সেটাকে সীমাবদ্ধ করার চেষ্টা করি তখন এই অক্ষমতা নিজেকে খুব স্পষ্ট করে তোলে এবং আমাকে ধীর করে দেয়।
নামকরণকারী

1
ভাল তথ্য। আমি এই ব্যতিক্রমটি আমার সর্বনিম্ন স্বজ্ঞাত ব্যতিক্রম বার্তাগুলির তালিকায় যুক্ত করছি। এটি কেন ঘটছে তা আপনি বুঝতে পারার পরেই এটি অর্থবোধ করে।
ডিভি কে

2

কেউ এই জন্য অনুসন্ধান করে কিনা জানি না। আমারও একই সমস্যা ছিল। ক্যোয়ারিতে একটি নির্বাচন করুন এবং তারপরে যেখানে (বা যোগদান করুন) করছেন এবং নির্বাচনটি পরিবর্তনশীল ব্যবহার করে আমার সমস্যার সমাধান করেছেন। (সমস্যাটি আমার জন্য "পুনরায় সংযুক্তি" সংগ্রহে ছিল)

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সম্ভাব্য নাল রেফারেন্সএক্সেপশন

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
ভেরিয়েবল টাইপ ইস্যু নয়। আমার ক্ষেত্রে ত্রুটিটি ঘটেছে কারণ হিউ ক্লজের অভ্যন্তরে একটি। ফার্স্টআরডিফল্ট () করছিল।
কলিন

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

EF Equalsপুরোপুরি ভাল গ্রহণ করে ।
গার্ট আর্নল্ড

0

কেবল আসইনামারেবল () এবং টোলিস্ট () যুক্ত করুন, সুতরাং এটি দেখতে এটির মতো দেখাচ্ছে

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

আমি ভাবছিলাম যে কেন এই সমস্যাটি ঘটেছিল, এবং এখন আমি মনে করি কারণ এটি আপনি লিনকিউ এর মাধ্যমে কোনও জিজ্ঞাসা করার পরে , ফলাফলটি স্মৃতিতে থাকবে এবং বস্তুগুলিতে লোড করা হবে না , আমি জানি না state রাষ্ট্রটি কী তবে তারা কিছুতে রয়েছে আমি মনে করি ক্রান্তিকালীন অবস্থা । তারপরে আপনি যখন ব্যবহার করেন AsEnumerable()বা ToList()ইত্যাদি, আপনি এগুলিকে শারীরিক স্মৃতি বস্তুগুলিতে স্থাপন করছেন এবং সমস্যাটি সমাধান হচ্ছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.