। নেট কোর ৩.০ সত্তা ফ্রেমওয়ার্কে কীভাবে একটি গ্রুপ যোগদান করবেন?


13

.NET কোর 3.0 এ পরিবর্তনগুলি পেয়ে যাচ্ছি

... নেভিগেশনএক্সপ্যান্ডিংএক্সপ্রেসভিসিটার 'ব্যর্থ। এটি EF কোরে কোনও বাগ বা সীমাবদ্ধতা নির্দেশ করতে পারে। আরও বিস্তারিত তথ্যের জন্য https://go.microsoft.com/fwlink/?linkid=2101433 দেখুন )) ---> সিস্টেম.In अवैधOperationException: লিনকিউ এক্সপ্রেশন 'গ্রুপজইন প্রক্রিয়াজাতকরণ, ...

এটি সত্যিই একটি সহজ ক্যোয়ারী তাই এটি সম্পাদন করার জন্য অবশ্যই একটি উপায় থাকতে হবে। নেট কোর 3.0.০:

 var queryResults1 = await patients
            .GroupJoin(
                _context.Studies,
                p => p.Id,
                s => s.Patient.Id,
                (p, studies) => new 
                {
                    p.DateOfBirth,
                    p.Id,
                    p.Name,
                    p.Sex,
                   Studies =studies.Select(s1=>s1)
                }
            )
            .AsNoTracking().ToListAsync();

আমি মূলত একটি লিনক ক্যোয়ারী (বা উপরের মতো পদ্ধতি সিনট্যাক্স) সন্ধান করছি যা স্টাডিজ রোগীদের উপর যোগ দেবে এবং প্রদত্ত রোগীর জন্য অধ্যয়ন না থাকলে স্টাডিজকে একটি খালি তালিকায় বা নালীর সাথে সেট করবে।

কোন ধারনা? এটি নেট কোর ২.২ এ কাজ করছিল। এছাড়াও উপরের এমএসএফটি লিঙ্কটিতে উল্লেখ করা হয়েছে যে কী ব্রেকিং পরিবর্তন ক্লায়েন্টের পার্শ্ব মূল্যায়নের সাথে সম্পর্কিত এবং এড়ানো এড়ানো যে উত্পন্ন ক্যোয়ারী পুরো টেবিলগুলি পড়বে যা অবশ্যই ক্লায়েন্টের সাথে যুক্ত হতে হবে বা ফিল্টার করা উচিত। তবে এই সাধারণ ক্যোয়ারির সাথে, যোগদানটি সহজেই সার্ভারের পক্ষে করা উচিত।

উত্তর:


11

এখানে আলোচিত হিসাবে , আপনি এমন একটি কোয়েরি চেষ্টা করছেন যা ডেটাবেস দ্বারা সমর্থিত নয়। আপনার কোডটি কাজ করতে EF কোর 2 ক্লায়েন্ট-সাইড মূল্যায়ন ব্যবহার করেছে, তবে EF কোর 3 প্রত্যাখ্যান করেছে, কারণ ক্লায়েন্ট-সাইড সুবিধাটি ডেটাসেট বাড়ার সাথে সাথে হার্ড-টু-ডিবাগ পারফরম্যান্স সমস্যার জন্য ব্যয় হয়।

আপনি DefaultIfEmptyরোগীদের পড়াশুনায় যোগ দিতে বাম দিকে ব্যবহার করতে পারেন এবং তারপরে ম্যানুয়ালি গ্রুপ করতে পারেন ToLookup

var query =
    from p in db.Patients
    join s in db.Studies on p.Id equals s.PatientId into studies
    from s in studies.DefaultIfEmpty()
    select new { Patient = p, Study = s };

var grouping = query.ToLookup(e => e.Patient); // Grouping done client side

উপরের উদাহরণটি সম্পূর্ণ রোগী এবং অধ্যয়ন সত্তাকে আকড়ে ধরে তবে আপনি পরিবর্তে কলাম কলাম চেরি করতে পারেন। রোগীর কাছ থেকে আপনার প্রয়োজনীয় ডেটা যদি প্রতিটি অধ্যয়নের জন্য পুনরাবৃত্তি করতে না পারে তবে যোগ করা ক্যোয়ারিতে কেবলমাত্র রোগীর আইডি নির্বাচন করুন, বাকী রোগীর ডেটা আলাদা আলাদা-যোগ না হওয়া কোয়েরিতে জিজ্ঞাসা করে।


2
উত্তর কাজ করে! আমার অনুমান ক্যোরি অনুবাদকের আরও কিছু কাজ বাকি আছে। এর মতো একটি সাধারণ ক্যোয়ারী অনুবাদযোগ্য হওয়া উচিত। এফকে / সূচকগুলি সঠিক বলে ধরে নিয়ে ডেটাসেট বৃদ্ধি করে 2 টি টেবিলের একটি সহজ গ্রুপে যোগদানের জন্য পারফরম্যান্সের সমস্যা থাকতে হবে না। আমার সন্দেহ হয় অনেকের টিআইএস সমস্যা থাকবে, একটি 2 টেবিল গ্রুপ জয়েন বেশ মান এবং প্রায়শই ব্যবহৃত কোয়েরি।
শেলবিপিরের

@ she72 আমি সম্মত দেখে মনে হচ্ছে যে লিনকিউ এবং এসকিউএল "গ্রুপ" কীওয়ার্ডটি কীভাবে ব্যবহার করে তার মধ্যে পার্থক্য থেকেই সমস্যাটি দেখা দিয়েছে। EF কোর লিংকটি groupbyবাম যোগগুলিতে অনুবাদ করতে হবে যেখানে এটি করা প্রত্যাশার চেয়ে বেশি সারি পিছনে টানবে না। আমি সে অনুযায়ী একটি মন্তব্য পোস্ট ।
এডওয়ার্ড ব্রে

আমার একটি ফলো-আপ প্রশ্ন রয়েছে, আমি এখনও বুঝতে চেষ্টা করছি যে এই ধরণের প্রশ্নের জন্য গ্রুপিং কেন ক্লায়েন্ট পক্ষের করা দরকার, এটি নতুন লিনকিউ কাঠামোর একটি সীমাবদ্ধতা বলে মনে হচ্ছে। উপরের মামলার জন্য আমি কোনও ঝুঁকি দেখতে পাচ্ছি না যে এটি অপ্রত্যাশিত উপায়ে ক্লায়েন্টের পাশের কার্যকারিতাটি কমিয়ে দেয়। আপনি কি স্পষ্ট করতে পারেন?
শেলবিপিরের

1
এবং আরও ফলোআপ হিসাবে প্রধান উদ্বেগটি হ'ল: আপনার সংস্কারিত ক্যোয়ারিতে গ্রাহক পক্ষের কোন গ্রুপটি রয়েছে যদি আমার প্রতি রোগীর প্রতি 1000 টি পড়াশোনা হয় তবে আমি প্রতিটি রোগীকে ডিবি থেকে 1000 বার লোড করব? এই কাজটি ডিবিতে করার জন্য এবং দলবদ্ধ ফলাফলগুলি ফেরত দেওয়ার জন্য কি বিকল্প আছে?
শেলবিপিরের

1
@ শেভ the২ ডাটাবেসকে একমাত্র গোষ্ঠীভুক্ত করা সমষ্টিকে জড়িত, উদাহরণস্বরূপ রোগীর প্রতি অধ্যয়নের একটি গণনা সহ রোগীদের একটি ক্যোয়ারী। ডাটাবেস সবসময় একটি আয়তক্ষেত্রাকার ডেটাসেট ফেরত দেয়। একটি শ্রেণিবদ্ধ গ্রুপিং ক্লায়েন্ট দ্বারা রচনা করা আছে। আপনি এটিকে ক্লায়েন্ট-পার্শ্ব মূল্যায়ন বা ORM এর অংশ হিসাবে দেখতে পারেন । একটি শ্রেণিবদ্ধ গ্রুপিংয়ে, প্যারেন্ট সত্তা ডেটা পুনরায় জিজ্ঞাসা করা না হলেও পুনরাবৃত্তি হয়।
এডওয়ার্ড ব্রে

0

ঠিক একই সমস্যা এবং এটির সাথে একটি বিশাল লড়াই ছিল। দেখা যাচ্ছে যে .net কোর 3.0 পদ্ধতি সিনট্যাক্সে (এখনও?) যোগ দিন বা গ্রুপজাইনকে সমর্থন করে না। মজার অংশটি যদিও, এটি কোয়েরি সিনট্যাক্সে কাজ করে।

এটি চেষ্টা করে দেখুন, এটি কিছুটা পদ্ধতি সিনট্যাক্সের সাহায্যে ক্যোয়ার সিনট্যাক্স। এটি একটি দুর্দান্ত বাম বাহিরের যোগদানের সাথে সঠিক এসকিউএল ক্যোয়ারিতে সুন্দরভাবে অনুবাদ করে এবং এটি ডাটাবেসে প্রক্রিয়া করা হয়। আমি আপনার মডেলগুলি পেলাম না তাই আপনার নিজের বাক্য গঠন নিজেই পরীক্ষা করা দরকার ....

var queryResults1 = 
    (from p in _context.patients
    from s in _context.Studies.Where(st => st.PatientId == p.Id).DefaultIfEmpty()
    select new
    {
        p.DateOfBirth,
        p.Id,
        p.Name,
        p.Sex,
        Studies = studies.Select(s1 => s1)
    }).ToListAsync();

যাইহোক, মেথড সিনট্যাক ডিও সহ জয়েন এবং গ্রুপজউইন নন-কোর ফ্রেমওয়ার্ক এবং ইএফের সাথে কাজ করে। এবং ডান ক্যোয়ারিতে অনুবাদ করুন যা সার্ভারের দিক থেকে
সজ্জিত

1
পড়াশুনায় পড়াশুনা কী। নির্বাচন করুন (s1 => এস 1)
অঙ্কুর অরোরা

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