সংস্থাগুলিতে লিনকিউ 'সিস্টেম.স্ট্রিং ফর্ম্যাট (সিস্টেম.স্ট্রিং, সিস্টেম.অজেক্ট, সিস্টেম.অজেক্ট)' পদ্ধতিটি স্বীকৃতি দেয় না '


88

আমার এই লিনক ক্যোয়ারী রয়েছে:

private void GetReceivedInvoiceTasks(User user, List<Task> tasks)
{
    var areaIds = user.Areas.Select(x => x.AreaId).ToArray();

    var taskList = from i in _db.Invoices
                   join a in _db.Areas on i.AreaId equals a.AreaId
                   where i.Status == InvoiceStatuses.Received && areaIds.Contains(a.AreaId)
                   select new Task {
                       LinkText = string.Format(Invoice {0} has been received from {1}, i.InvoiceNumber, i.Organisation.Name),
                       Link = Views.Edit
                   };
}

যদিও এটি সমস্যা আছে। আমি কাজ তৈরি করার চেষ্টা করছি। প্রতিটি নতুন কাজের জন্য যখন আমি লিঙ্ক পাঠ্যটিকে "হ্যালো" এর মতো ধ্রুব স্ট্রিংয়ে সেট করি ঠিক আছে is তবে উপরে আমি চালানের বৈশিষ্ট্য ব্যবহার করে সম্পত্তি লিঙ্কটেক্সট তৈরি করার চেষ্টা করছি।

আমি এই ত্রুটি পেয়েছি:

বেস {সিস্টেম.সিস্টেমএক্সেপশন} = LIN "সত্তা থেকে লিনকিউ 'পদ্ধতি' সিস্টেম.স্ট্রিং ফর্ম্যাট (সিস্টেম.স্ট্রিং, সিস্টেম.অজেক্ট, সিস্টেম.অজেক্ট) 'পদ্ধতিটি স্বীকৃতি দেয় না এবং এই পদ্ধতির কোনও স্টোর এক্সপ্রেশন হিসাবে অনুবাদ করা যায় না।" }

কেউ জানেন কেন? এটির কাজ করার জন্য যে কেউ এটি করার কোনও বিকল্প উপায় জানেন?


হ্যাঁ,
এটিকে

উত্তর:


148

সত্তা ফ্রেমওয়ার্ক এসকিউএল দিকে আপনার প্রজেকশনটি সম্পাদন করার চেষ্টা করছে, যেখানে এর সমতুল্য নেই string.FormatAsEnumerable()লিনকের সাথে এই অংশের মূল্যায়নকে জোর করে ব্যবহার করতে অবজেক্টে।

পূর্ববর্তী উত্তরের ভিত্তিতে আমি আপনাকে দিয়েছি আমি আপনার প্রশ্নের পুনর্গঠন করব:

int statusReceived = (int)InvoiceStatuses.Received;
var areaIds = user.Areas.Select(x=> x.AreaId).ToArray();

var taskList = (from i in _db.Invoices
               where i.Status == statusReceived && areaIds.Contains(i.AreaId)
               select i)
               .AsEnumerable()
               .Select( x => new Task()
               {
                  LinkText = string.Format("Invoice {0} has been received from {1}", x.InvoiceNumber, x.Organisation.Name),
                  Link = Views.Edit
                });

এছাড়াও আমি দেখতে পেয়েছি যে আপনি কোয়েরিতে সম্পর্কিত সত্ত্বাগুলি ব্যবহার করছেন ( Organisation.Name) নিশ্চিত করুন যে Includeআপনি আপনার ক্যোয়ারিতে যথাযথ যোগ করেছেন , বা বিশেষত পরে ব্যবহারের জন্য এই বৈশিষ্ট্যগুলিকে রূপায়িত করেছেন, যেমন:

var taskList = (from i in _db.Invoices
               where i.Status == statusReceived && areaIds.Contains(i.AreaId)
               select new { i.InvoiceNumber, OrganisationName = i.Organisation.Name})
               .AsEnumerable()
               .Select( x => new Task()
               {
                  LinkText = string.Format("Invoice {0} has been received from {1}", x.InvoiceNumber, x.OrganisationName),
                  Link = Views.Edit
                });

এক্সপ্রেশন ট্রি ট্রান্সলেশনের কারণে সিলেক্ট-নতুন-টাস্ক অংশটি সার্ভার সাইডে ঘটতে পারে না তা ছাড়াও এটিও খেয়াল করা উচিত যে এটি করা অনাকাঙ্ক্ষিত। সম্ভবত, আপনি কাজগুলি ক্লায়েন্ট সাইড তৈরি করতে চান। কাজেই ক্যোয়ারীর বিভাজন এবং কার্যাদি তৈরির বিষয়টি আরও স্পষ্ট হতে পারে।
টর্মোড

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

4
@ ডেভিন: হ্যাঁ, আমি একমত - বাস্তবে দ্বিতীয় ক্যোয়ারের উদাহরণটি ঠিক এটি করছে।
ব্রোকেনগ্লাস

15

IQueryableথেকে আহরিত IEnumerable, প্রধান প্রতিচ্ছায়া যে আপনি যখন আপনার প্রশ্নের এটিকে এটা ভাষায় ডাটাবেসের ইঞ্জিন পোস্ট হয়, পাতলা মুহূর্ত যেখানে আপনি C # এর বল সার্ভার (না ক্লায়েন্ট সাইড) ডেটা পরিচালনা করতে বা হ্যান্ডেল এসকিউএল বলতে তথ্য।

সুতরাং মূলত যখন আপনি বলেন IEnumerable.ToString(), সি # তথ্য সংগ্রহ ToString()করে এবং বস্তুটিতে কল করে। কিন্তু যখন আপনি বলছেন যে IQueryable.ToString()সি # এসকিউএলকে ToString()অবজেক্টটিতে কল করতে বলে তবে এসকিউএল তেমন কোনও পদ্ধতি নেই।

অপূর্ণতাটি হ'ল আপনি যখন সি # তে ডেটা পরিচালনা করেন তখন পুরো # যে সংগ্রহটি আপনি দেখছেন তা অবশ্যই সি # ফিল্টারগুলি প্রয়োগ করার আগে মেমোরিতে তৈরি করা উচিত।

এটি করার সর্বাধিক দক্ষ উপায় হ'ল আপনি IQueryableযে সমস্ত ফিল্টার প্রয়োগ করতে পারেন তার সাথে ক্যোয়ারী তৈরি করা ।

এবং তারপরে এটিকে স্মৃতিতে গড়ে তুলুন এবং সি # তে ডেটা ফর্ম্যাট করুন।

IQueryable<Customer> dataQuery = Customers.Where(c => c.ID < 100 && c.ZIP == 12345 && c.Name == "John Doe");

 var inMemCollection = dataQuery.AsEnumerable().Select(c => new
                                                  {
                                                     c.ID
                                                     c.Name,
                                                     c.ZIP,
                                                     c.DateRegisterred.ToString("dd,MMM,yyyy")
                                                   });

3

যদিও এসকিউএল একটি string.Formatস্ট্রিং সংমিশ্রণ সম্পাদন করতে পারে এটি দিয়ে কী করবেন তা জানেন না ।

আপনি যদি নিম্নলিখিত কোডটি চালান তবে আপনার পরে থাকা ডেটাটি পাওয়া উচিত।

var taskList = from i in _db.Invoices
               join a in _db.Areas on i.AreaId equals a.AreaId
               where i.Status == InvoiceStatuses.Received && areaIds.Contains(a.AreaId)
               select new Task {
                   LinkText = "Invoice " + i.InvoiceNumber + "has been received from " + i.Organisation.Name),
                   Link = Views.Edit
               };

আপনি একবার কোয়েরিটি সম্পাদন করার AsEnumerableপরে এটি ব্যবহারের চেয়ে সামান্য দ্রুত হওয়া উচিত (কমপক্ষে এটিই আপনার নিজের মতো একই মূল ত্রুটির পরে আমার নিজের কোডে পেয়েছি)। আপনি যদি সি # এর সাথে আরও জটিল কিছু করছেন তবে আপনাকে এখনও এটি ব্যবহার করতে হবে AsEnumerable


4
নিশ্চিত নন যে কেন লিন্ক FORMATMESSAGE ফাংশন ডকস.মাইক্রোসফটকম / en- us/ sql/t- sql/ funitions/… ব্যবহার করতে মানিয়ে নেওয়া যায় না তারপরে আপনার সমাধানটি (
বস্তুতীকরণকে

4
ডাটাবেস কাঠামো এবং সম্পর্কিত কলামগুলির সংখ্যার উপর নির্ভর করে এই পদ্ধতিটির পরিবর্তে ব্যবহার AsEnumerable()করা আরও বেশি দক্ষ হতে পারে। এড়িয়ে চলুন AsEnumerable()এবং ToList()যতক্ষণ না আপনি সত্যই সমস্ত ফলাফল মেমরিতে আনতে চান।
ক্রিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.