লিনকে ইনটি স্ট্রিংকে সত্তায় রূপান্তর করতে সমস্যা


202
var items = from c in contacts
            select new ListItem
            {
                Value = c.ContactId, //Cannot implicitly convert type 'int' (ContactId) to 'string' (Value).
                Text = c.Name
            };
var items = from c in contacts
            select new ListItem
            {
                Value = c.ContactId.ToString(), //Throws exception: ToString is not supported in linq to entities.
                Text = c.Name
            };

আমি কি এটা অর্জন করতে পারি? দ্রষ্টব্য, VB.NET- এ কোনও সমস্যা নেই প্রথম স্নিপেটটি এটি দুর্দান্তভাবে কাজ করে, VB নমনীয়, আমি সি # এর কঠোরতার সাথে অভ্যস্ত হতে পারছি না !!!


2
.ToString () VB- এ লিনাকটোওএফের পক্ষেও কাজ করে না। আইএমএইচও, নির্বোধের মতো।
স্টিংজি জ্যাক

5
@ স্টেটিং জ্যাক, সমস্যাটি এলিনকিউ (লিনক 2 সত্তা) এর সাথে রয়েছে কারণ এটি আপনার কোডটি এসকিউএলে অনুবাদ করে এবং যখন এটি অভ্যন্তরীণ টোস্ট্রিংয়ের অনুরোধ আসে তখন এটি এসকিউএল-তে 'টোস্ট্রিং' অনুবাদ কীভাবে করতে পারে তা জানে না। লিনক 2 অবজেক্টের সাথে পৃথক নয়, যখন কোনও অনুবাদ নেই, এবং সবকিছু সিএলআর ল্যাম্বডাস হয়, তবে এটি সরাসরি অনুরোধকৃত বস্তুগুলিতে সম্পাদিত হয়।
শিমি ওয়েটজ্যান্ডলার

1
আমি কেবল বিরক্ত হয়েছি যে তারা এই ধরণের ত্রুটিটি সংকলিত হতে দেয় এবং কারণটির একটি সরল ইংরেজী বিবরণ (আইনী-ইএস এবং একাডেমিয়া-ইএস) এর সরল ইংরেজী বিবরণ খুঁজতে আমাকে চিরতরে ট্রল করতে হয়েছিল।
স্টিংজি জ্যাক

1
আপনি ঠিক বলেছেন, তবে সেগুলিও ঠিক, তারা এসএলকিউলে সমস্ত সিএলআর এবং কাস্টমাইজড সিএলআর কার্যকারিতা অনুবাদ করার কথা নয়, বিশেষত EF এর খুব প্রথম সংস্করণে নয় :) টোস্ট্রিং সম্পর্কে, ব্রায়ানের উত্তর পড়ুন: স্ট্যাকওভারফ্লো। com / প্রশ্নগুলি / 1066760 /…
শিমি ওয়েটজ্যান্ডলার

দুর্দান্ত, তবে কীভাবে লোকেরা 3.5 ব্যবহার করবে না, 4? তারপর কি?
একটেরিনা

উত্তর:


313

EF v4 এর সাহায্যে আপনি ব্যবহার করতে পারেন SqlFunctions.StringConvert। ইন্টের জন্য কোনও ওভারলোড নেই তাই আপনাকে ডাবল বা দশমিক toালতে হবে। আপনার কোডটি এর মতো দেখতে শেষ হবে:

var items = from c in contacts
            select new ListItem
            {
                Value = SqlFunctions.StringConvert((double)c.ContactId).Trim(),
                Text = c.Name
            };

234
কেন পৃথিবীতে তারা কোনও অতিরিক্ত বোঝা অন্তর্ভুক্ত করবে না?
জেরেমি কেনেন

7
@ নেস্টার এটি এসকিউএল কমপ্যাক্টের জন্য কাজ করে না। খুঁজে পেলাম শক্ত পথ।
অস্টিন

24
ফলাফলের আগে সাদা SqlFunctions.StringConvert((double)c.ContactId).Trim()
স্থানগুলি

2
সিস্টেম.ডাটা.এসকিউএলটি দ্য পদ্ধতিটি 'সিস্টেম.স্ট্রিং স্ট্রিংকনভার্ট (সিস্টেম.নুল্লেবল 1 [সিস্টেম.ডুবল])' টাইপ করে 'সিস্টেম.ডাটা.অবজেক্টস.সকিএলসিলেট.সক্লিলফিউশনস' এসআইকিউইটস আইকন স্পিচেরাউসড্রাক ব্যবহার করে এসকিউএলাইটের জন্য কাজ করবেন না বলে মনে হচ্ছে প্রতিষ্ঠানের জন্য 'লিনিকউ' জন্য ("লিনকিউ থেকে সত্তাগুলিতে" অনুবাদ করা যাবে না)
ওয়ান ওয়ার্ল্ড

5
দুর্দান্ত উত্তর! কেবল দয়া করে মনে রাখবেন, আপনি EF 6 ব্যবহার করে শুরু করে, ক্লাসটি অন্য নামস্থানে চলে গেছে। সুতরাং, EF 6 এর আগে আপনার এইগুলি অন্তর্ভুক্ত করা উচিত: "সিস্টেম.ডাটা.অবজেক্টস.এসএলএল ক্লায়েন্ট" আপনি যদি EF 6 এ আপডেট করেন বা কেবল এই সংস্করণটি ব্যবহার করেন তবে অন্তর্ভুক্ত করুন: "সিস্টেম.ডাটা.এন্টিটি.সকিএল সার্ভার" এর সাথে ভুল নেমস্পেস অন্তর্ভুক্ত করে EF6, কোডটি ঠিকঠাক সংকলন করবে তবে রানটাইম ত্রুটি নিক্ষেপ করবে। আমি আশা করি এই নোটটি কিছু বিভ্রান্তি এড়াতে সহায়তা করে।
লিও

12

আমি জিজ্ঞাসার বাইরে স্ট্রিংয়ের জন্য পূর্ণসংখ্যার রূপান্তর স্থাপন করে একটি অনুরূপ সমস্যা সমাধান করেছি। এটি কোনও বস্তুর মধ্যে ক্যোয়ারী রেখেই অর্জন করা যায়।

var items = from c in contacts
            select new 
            {
                Value = c.ContactId,
                Text = c.Name
            };
var itemList = new SelectList();
foreach (var item in items)
{
    itemList.Add(new SelectListItem{ Value = item.ContactId, Text = item.Name });
}

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

9

লিনকটোওজেক্ট: পরিচিতিগুলি ব্যবহার করুন। AsEnumerable ()

var items = from c in contacts.AsEnumerable()
            select new ListItem
            {
                Value = c.ContactId.ToString(),
                Text = c.Name
            };

ধন্যবাদ। এফওয়াইআই, আমি কিছুটা আলাদা সমস্যা সমাধান করার চেষ্টা করছি। সত্ত্বা / ল্যাম্বদা এবং এই কাজগুলিতে আমি লিনকিউ ব্যবহার করছি। আমি ম্যাচিং ফলাফল খুঁজে নিতে স্ট্রিং এবং ব্যবহার করা কোন int রূপান্তর করার চেষ্টা করা হয় "রয়েছে।" -> অর্থাত db.contacts.AsEnumerable () কোথায় (। গ => c.ContactId.ToString () রয়েছে ( searchitem ।)) ToList (); ;
ejhost

9
আপনি যদি কল করেন তবে AsEnumerableআপনি বৃহত্তর ডাটাবেসে উচ্চ পারফরম্যান্সের মূল্য প্রদান করবেন কারণ এটি মেমরিতে সমস্ত কিছুই আনবে। IEnumerableএর সাথে তুলনায় ধীর গতির IQueryableকারণ পরে ডেটাবেজে একচেটিয়াভাবে কার্যকর করা হয়।
কোডআর্টিস্ট

5

SQLlFunifications.StringConvers কাজ করবে, তবে আমি এটিকে জটিল বলে মনে করি এবং বেশিরভাগ সময় এসকিউএল পক্ষের স্ট্রিং রূপান্তর সম্পাদনের আমার সত্যিকারের প্রয়োজন হয় না।

আমি স্ট্রিং ম্যানিপুলেশন করতে চাইলে আমি যা করি তা হল লিনাক-টু-সত্তাগুলিতে কোয়েরিটি সম্পাদন করা, তারপরে লিংক-টু-অবজেক্টে স্টিংগুলি ম্যানিপুলেট করুন। এই উদাহরণে, আমি কোনও পরিচিতির পুরো নাম এবং কন্টাক্টলোকেশনকি যুক্ত ডেটার একটি সেট পেতে চাই যা দুটি পূর্ণসংখ্যা কলাম (কন্টাক্টআইডি এবং লোকেশনআইডি) এর স্ট্রিং সংমিশ্রণ।

// perform the linq-to-entities query, query execution is triggered by ToArray()
var data =
   (from c in Context.Contacts
   select new {
       c.ContactID,
       c.FullName,
       c.LocationID
   }).ToArray();

// at this point, the database has been called and we are working in
// linq-to-objects where ToString() is supported
// Key2 is an extra example that wouldn't work in linq-to-entities
var data2 =
   (from c in data
    select new {
       c.FullName,
       ContactLocationKey = c.ContactID.ToString() + "." + c.LocationID.ToString(),
       Key2 = string.Join(".", c.ContactID.ToString(), c.LocationID.ToString())
    }).ToArray();

এখন, আমি সম্মতি দিচ্ছি যে এটি দুটি বেনামে নির্বাচন লিখতে অসুবিধাজনক হবে তবে আমি যুক্তি দিয়ে বলতে পারি যে আপনি L2E সমর্থন করে না স্ট্রিং (এবং অন্যান্য) ফাংশন সম্পাদন করতে পারেন এমন সুবিধার্থে আশ্চর্যজনক। এছাড়াও মনে রাখবেন যে সম্ভবত এই পদ্ধতিটি ব্যবহার করে কোনও পারফরম্যান্স পেনাল্টি রয়েছে।


4
public static IEnumerable<SelectListItem> GetCustomerList()
        {
            using (SiteDataContext db = new SiteDataContext())
            {
                var list = from l in db.Customers.AsEnumerable()
                           orderby l.CompanyName
                           select new SelectListItem { Value = l.CustomerID.ToString(), Text = l.CompanyName };

                return list.ToList();
            }
        }

আপনি এটি পরীক্ষা করেছেন এবং এটি কাজ করে? পড়া এই সামনে উত্তর।
শিমি ওয়েইজস্যান্ডলার

হ্যাঁ, আমি এটি ইতিমধ্যে ব্যবহার করছি। এটি এমভিসি 3, ইএফ 4, সিটিপি 5, এসকিউএল সিই 4 এর জন্য কাজ করে।
নেস্টর

বক্সিংটি দ্বিগুণ করা এবং স্ট্রিংকনভার্ট ব্যবহার করার চেয়ে এটি আরও মার্জিত বলে মনে হচ্ছে।
CmdrTallen

9
তবে এক্ষেত্রে আপনি ডাটাবেস থেকে সমস্ত ডেটা আনবেন তারপর ধরুন আপনি আগে এই তালিকায় কিছু ফিল্টারিং করতে চান return list.ToList();!!
ওয়াহিদ বিটার

4
আপনি যখন এসকিএলএফুনশানগুলি অ্যাক্সেস করতে পারবেন না তখন এগুলি ছাড়া আপনার কাছে অন্য অনেক বিকল্প নেই। যাইহোক, আমি আমার জিজ্ঞাসার জন্য এই ব্যবহার করেছেন হবে: return (from l in db.Customers orderby l.CompanyName select new {Id=l.CustomerID, Name=l.CompanyName}).AsEnumerable().Select(c=> new SelectListItem{Value=c.Id.ToString(), Text = c.Name}).ToList();। এইভাবে করাটি কেবল ডিবি থেকে আইডি / নাম পায় (সমস্ত গ্রাহকের বৈশিষ্ট্যের পরিবর্তে) এবং ডিবিতে আরও দক্ষ সূচক ব্যবহার করে বাছাই করে।
ব্রায়ান ক্যাথন

3
var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
    Text = a.ClassName,
    Value = a.ClassId.ToString()
});

প্রথমত, অবজেক্টে রূপান্তর করুন, তারপরে টুস্ট্রিং () সঠিক হবে।


3

ব্রায়ান ক্যাথনের উত্তর দুর্দান্ত! কিছুটা আপডেট, EF 6 এর জন্য, ক্লাসটি অন্য নামস্থানে চলে গেছে moved সুতরাং, EF 6 এর আগে আপনার অন্তর্ভুক্ত করা উচিত:

System.Data.Objects.SqlClient

আপনি যদি EF 6 এ আপডেট হন বা কেবল এই সংস্করণটি ব্যবহার করছেন তবে অন্তর্ভুক্ত করুন:

System.Data.Entity.SqlServer

EF6 এর সাথে ভুল নেমস্পেসটি অন্তর্ভুক্ত করে কোডটি ঠিক ঠিক সংকলন করবে তবে রানটাইম ত্রুটি নিক্ষেপ করবে। আমি আশা করি এই নোটটি কিছু বিভ্রান্তি এড়াতে সহায়তা করে।


আমার বলতে হবে যে আপনার উত্তরটিও দুর্দান্ত। আমি ইএফ 6 এ আপগ্রেড করেছি এবং সিক্লু ফাংশনগুলির জন্য সর্বত্র খুঁজছি। আপনার উত্তর আমাকে সঠিক দিকে নির্দেশ করেছে। আমি কেবল যুক্ত করব যে আপনার যেমন এনটিটি ফ্রেমওয়ার্ক.সকিউএল সার্ভারের একটি রেফারেন্সও প্রয়োজন (আপনার কেবলমাত্র সত্ত্বা ফ্রেমওয়ার্কের একটি রেফারেন্স থাকতে পারে)।
মেটালজিক

2

আমি আমার এমভিসি 2 অ্যাপ্লিকেশনটিকে এমভিসি 3 তে রূপান্তর করার সময় এবং এই সমস্যার সমাধানের জন্য আরও একটি (পরিষ্কার) সমাধান দিতে গিয়ে আমি যা করেছি তা পোস্ট করতে চাইলে আমি এই একই সমস্যায় পড়েছিলাম ...

IEnumerable<SelectListItem> producers = new SelectList(Services.GetProducers(),
    "ID", "Name", model.ProducerID);

গেটপ্রেডারস () কেবল প্রযোজকদের একটি সত্তা সংগ্রহ প্রদান করে। PS এসকিএলএফুনিউশনস। স্ট্রিংকনভার্ট আমার পক্ষে কাজ করেনি।


2

যদি আপনার "পরিচিতি" জেনেরিক তালিকা হিসাবে কাজ করে তবে আমি আশা করি যে নিম্নলিখিত কোডটি ভালভাবে কাজ করবে।

var items = contact.Distinct().OrderBy(c => c.Name)
                              .Select( c => new ListItem
                              {
                                Value = c.ContactId.ToString(),
                                Text = c.Name
                              });

ধন্যবাদ।


2

আরও একটি সমাধান:

c.ContactId + ""

খালি স্ট্রিং যুক্ত করুন এবং এটি স্ট্রিংয়ে রূপান্তরিত হবে।


প্রত্যাবর্তিত ত্রুটি: System.NotSupportedException: 'System.Object' টাইপ করতে 'System.Int64' টাইপটি কাস্ট করতে অক্ষম। সংস্থাগুলিতে লিনকিউ কেবল ইডিএম আদিম বা গণনা প্রকারের castালাই সমর্থন করে।
কিউমাস্টার

1

মাইএসকিউএল ব্যবহার করে, SqlFunctions.StringConvertআমার পক্ষে কাজ করে না। যেহেতু আমি SelectListItemআমার প্রকল্পে 20+ জায়গায় ব্যবহার করি, তাই আমি এমন একটি সমাধান চেয়েছিলাম যা 20+ লিনকিউ বিবৃতিগুলিকে সংযুক্ত না করে কাজ করে। আমার সমাধানটি ছিল সাব-ক্লাসেSelectedListItem একটি পূর্ণসংখ্যা সেটার সরবরাহের ছিল, যা লিঙ্ক থেকে দূরে রূপান্তরকে টাইপ করে। স্পষ্টতই, এই সমাধানটি সাধারণ করা কঠিন, তবে এটি আমার নির্দিষ্ট প্রকল্পের জন্য বেশ সহায়ক ছিল।

ব্যবহারের জন্য, নিম্নলিখিত SelectedListItemলিংকটি তৈরি করুন এবং আপনার লিনকুই ক্যোয়ারিতে স্থানে ব্যবহার করুন এবং মানের জায়গায় ইন্টারভ্যালু ব্যবহার করুন।

public class BtoSelectedListItem : SelectListItem
{
    public int IntValue
    {
        get { return string.IsNullOrEmpty(Value) ? 0 : int.Parse(Value); }
        set { Value = value.ToString(); }
    }
}

1

যদি আপনি সত্তার কাঠামো ব্যবহার করেন এবং আপনি কেবলমাত্র প্রাসঙ্গিকভাবে গ্রহণযোগ্য করতে চান তবে আপনি এটি লিনক ক্যোয়ারিতে ব্যবহার করতে পারেন আপনি এটি চেষ্টা করতে পারেন

var items = from c in contacts
        select new ListItem
        {
            Value = (int)ContractId 
            Text = c.Name
        };

এটি কাজ করবে কারণ (ইন্ট) ব্যবহার করে আপনার মানটি ইন্টিতে ফেলবে যাতে আপনার স্ট্রিংয়ের জন্য কোনও রূপান্তর প্রয়োজন না এবং আপনি যে ফলাফল চান তা পেতে পারেন।

এটি আমার প্রকল্পে আমার জন্য কাজ করেছে বলে আমি মনে করি এটি আপনার পক্ষে সহায়ক হবে


-2

আমার বোধগম্যতা হল আপনি আপনার মডেলটিকে "প্রসারিত" করতে একটি আংশিক শ্রেণি তৈরি করতে হবে এবং কেবলমাত্র এমন একটি সম্পত্তি যুক্ত করতে হবে যা ক্লাসের বাকী বৈশিষ্ট্যগুলি ব্যবহার করতে পারে।

public partial class Contact{

   public string ContactIdString
   {
      get{ 
            return this.ContactId.ToString();
      }
   } 
}

তারপর

var items = from c in contacts
select new ListItem
{
    Value = c.ContactIdString, 
    Text = c.Name
};

না, আপনি লিনকিউতে সত্তা হিসাবে কাস্টম বৈশিষ্ট্যগুলি ব্যবহার করতে পারবেন না (.NET 3.5 এ)।
ক্রেগ স্টান্টজ

1
আমি এটি পরীক্ষা করিনি, তবে এটিও কাজ করবে না। যেহেতু এটি কোনও টেবিল ক্ষেত্রের সম্পত্তি নয়। আমি প্রথমে এটিআররে () এর পরে অবজেক্টগুলিতে লিকিংয়ের মাধ্যমে এটি করতে পারি তবে আমি ডিবিকে জিজ্ঞাসা করতে চাই। আমি ধরে নিচ্ছি এটি করতে সক্ষম হবে না। আমি আমার নিজস্ব তালিকা তৈরি করেছি যা একটি ক্ষেত্রের ক্ষেত্র নেয়। এটি আমার পক্ষে আরও ভাল কাজ করে।
শিমি ওয়েটজ্যান্ডলার 13

-2
var items = from c in contacts
select new ListItem
{
    Value = String.Concat(c.ContactId), //This Works in Linq to Entity!
    Text = c.Name
};

আমি দেখতে পেয়েছি যে SqlFunctions.StringConvert((double)c.Age)ক্ষেত্রটি টাইপের হয় আমার পক্ষে কাজ করে নাNullable<Int32>

এটি খুঁজে পেতে পরীক্ষার এবং ত্রুটির শেষ কয়েক দিন ধরে আমাকে প্রচুর অনুসন্ধান করেছে।

আমি আশা করি এটি সেখানে কয়েক কোডারকে সহায়তা করবে।


1
আমার জন্য কাজ করে না। এটি ব্যতিক্রম ছোঁড়ে " ... System.String Concat(System.Object)স্টোর এক্সপ্রেশনটিতে অনুবাদ করা যায় না ... "।
স্লুমা

1
আমার পক্ষেও কাজ করে না। আমি "System.NotSupportedException": লিনকু টু ইউনিটগুলি 'সিস্টেম.স্ট্রিং কনক্যাট (সিস্টেম.অজেক্ট)' পদ্ধতিটি স্বীকৃতি দেয় না এবং এই পদ্ধতির কোনও স্টোর এক্সপ্রেশন হিসাবে অনুবাদ করা যায় না ""
camainc

1
কাজ করে না - এই উত্তরটি আবিষ্কার করুন [স্বাক্ষরিত ধারণা: লিনক টু সত্তা পদ্ধতি 'সিস্টেম.স্ট্রিং কনক্যাট (সিস্টেম.অজেক্ট)' পদ্ধতিটি স্বীকৃতি দেয় না এবং এই পদ্ধতিটি কোনও স্টোর এক্সপ্রেশন হিসাবে অনুবাদ করা যায় না]]
ফিলিপ মুনিন

-6

আপনি কি চেষ্টা করে দেখবেন:

var items = from c in contacts
        select new ListItem
        {
            Value = Convert.ToString(c.ContactId), 
            Text = c.Name
        };

উপরের কোডটি কাজ করবে না কারণ এটি একটি ত্রুটি ছুঁড়ে বলবে যে "সংস্থাগুলিতে লিনকিউ 'পদ্ধতিটি' সিস্টেম.সস্ট্রিং টুস্ট্রিং (ইন্ট 32) 'পদ্ধতিটি স্বীকৃতি দেয় না এবং এই পদ্ধতির কোনও স্টোর এক্সপ্রেশন হিসাবে অনুবাদ করা যায় না।"
GK
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.