সিকোয়েন্সে একাধিক উপাদান থাকে


110

লিনকের মাধ্যমে "RhsTruck" টাইপের একটি তালিকা দখল করা এবং সেগুলি প্রদর্শন করার জন্য আমার কিছু সমস্যা হচ্ছে।

আরএইচএসট্রকের ঠিক মেক, মডেল, সিরিয়াল ইত্যাদির যথাযথ বৈশিষ্ট্য রয়েছে ... আরএইচএসকাস্টমারের গ্রাহক নাম, গ্রাহক ঠিকানা, ইত্যাদি বৈশিষ্ট্য রয়েছে ...

আমি ত্রুটিটি পেতে থাকি "সিকোয়েন্সে একাধিক উপাদান রয়েছে"। কোন ধারনা? আমি কি এই ভুল পথে এগিয়ে যাচ্ছি?

public RhsCustomer GetCustomer(string customerNumber)
{
    using (RhsEbsDataContext context = new RhsEbsDataContext() )
    {
        RhsCustomer rc = (from x in context.custmasts
                          where x.kcustnum == customerNumber
                          select new RhsCustomer()
                        {
                            CustomerName = x.custname,
                            CustomerAddress = x.custadd + ", " + x.custcity
                            CustomerPhone = x.custphone,
                            CustomerFax = x.custfax
                        }).SingleOrDefault();
        return rc;
    }
}

public List<RhsTruck> GetEquipmentOwned(RhsCustomer cust)
{
    using (RhsEbsDataContext context = new RhsEbsDataContext())
    {
        var trucks = (from m in context.mkpops
                      join c in context.custmasts
                        on m.kcustnum equals c.kcustnum
                      where m.kcustnum == cust.CustomerNumber
                      select new RhsTruck
                    {
                        Make = m.kmfg,
                        Model = m.kmodel,
                        Serial = m.kserialnum,
                        EquipID = m.kserialno1,
                        IsRental = false
                    }).ToList();
        return trucks;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    string testCustNum = Page.Request.QueryString["custnum"].ToString();

    RhsCustomerRepository rcrep = new RhsCustomerRepository();
    RhsCustomer rc = rcrep.GetCustomer(testCustNum);
    List<RhsTruck> trucks = rcrep.GetEquipmentOwned(rc);

    // I want to display the List into a Gridview w/auto-generated columns
    GridViewTrucks.DataSource = trucks;
    GridViewTrucks.DataBind();   
}

1
ব্যবহারের নিতে <> , এসকিউএল সঙ্গে একই শীর্ষ () সমষ্টিগত ফাংশন,.Take(1).SingleOrDefault();
থেইন

উত্তর:


254

সমস্যাটি হ'ল আপনি ব্যবহার করছেন SingleOrDefault। এই পদ্ধতিটি কেবল তখনই সফল হবে যখন সংগ্রহগুলিতে ঠিক 0 বা 1 উপাদান থাকে। আমি বিশ্বাস করি যে আপনি অনুসন্ধান করছেন FirstOrDefaultযা সংগ্রহের মধ্যে কতগুলি উপাদানই নির্বিশেষে সফল হবে।


8

24
-1 "সমস্যাটি হ'ল আপনি সিঙ্গেলঅরডিফল্ট ব্যবহার করছেন" - আমি ওপিকে যা সংগ্রহ করতে পারি সেখান থেকে গ্রাহক আইডি খুঁজছি যা (আমার ধারণা ধরে নেওয়া যায়) অনন্য হওয়া উচিত, তাই SingleOrDefaultআসলে এর চেয়ে বেশি উপযুক্ত FirstOrDefault। এছাড়াও, এটি ওপির ডাটাবেস ডিজাইনের সাথে প্রকৃতপক্ষে আরও গুরুতর সমস্যা উত্থাপন করেছে কারণ এটি দেখায় যে একই আইডি সহ 2 জন গ্রাহক যুক্ত করা সম্ভব!
জেমস

27
@ জেমস, ওপি জানিয়েছে যে আমার উত্তরটি সঠিক ছিল এবং ব্যতিক্রমটি পরিষ্কারভাবে বলেছে যে সংগ্রহে একাধিক উপাদান রয়েছে যা SingleOrDefaultকখনও কাজ করা থেকে বিরত থাকে । সত্য যে এটি এখানে আরও ভাল ডাটাবেস ডিজাইন করা সম্ভব হতে পারে তবে এটি ওপিতে একটি মন্তব্য হিসাবে উত্তর হিসাবে আরও উপযুক্ত বলে মনে হয় এবং উত্তর -1 নয়।
JaredPar

9
আইএমও অন্তর্নিহিত সমস্যাটি শেষ পর্যন্ত ডিবি ডিজাইন হিসাবে দেখায় যে ডাটাবেসে 2 টি স্বতন্ত্র গ্রাহক আইডি যুক্ত করা যায়। SingleOrDefaultএকটি ব্যতিক্রম ছুঁড়েছে কারণ পদ্ধতিটি কী প্রত্যাশা করে এবং এটি কী সন্ধান করছে তার মধ্যে অসঙ্গতি রয়েছে। সুতরাং যদিও আপনার উত্তরটি ব্যতিক্রমটি বন্ধ করে দেয়, আমার পক্ষে, এটি আসলে সমস্যার সমাধান করে না এটি এটি "জেল থেকে মুক্ত" কার্ডের বেশি তাই -1।
জেমস

2
এটি বিভ্রান্তিকর! SingleOrDefaultতখন আপনি যদি সংগ্রহটি 0 বা 1 আইটেমের জন্য প্রত্যাশা করেন এবং আপনি প্রতিবার যা ঘটে তা পরীক্ষা করে দেখতে চান তখন এর ব্যবহার
অ্যাকিলিস

23

SingleOrDefaultExceptionঅনুক্রমের একাধিক উপাদান থাকলে পদ্ধতিটি একটি ছুড়ে দেয় ।

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


5
Use FirstOrDefault insted of SingleOrDefault..

সিঙ্গেলঅরডিফল্ট কোনও একক উপাদান বা শোধন করে যদি কোনও উপাদান না পাওয়া যায়। যদি 2 টি উপাদান যদি আপনার গণনার মধ্যে পাওয়া যায় তবে এটি আপনি যে ব্যতিক্রম দেখছেন তা ছুঁড়ে দেয়

ফার্স্টঅরডাফল্ট FIRS উপাদানটি খুঁজে পায় বা কোনও উপাদান না পাওয়া গেলে তা বাতিল করে দেয়। সুতরাং যদি 2 টি উপাদান থাকে যা আপনার অনুমানের সাথে মেলে তবে দ্বিতীয়টিকে উপেক্ষা করা হবে

   public int GetPackage(int id,int emp)
           {
             int getpackages=Convert.ToInt32(EmployerSubscriptionPackage.GetAllData().Where(x
   => x.SubscriptionPackageID ==`enter code here` id && x.EmployerID==emp ).FirstOrDefault().ID);
               return getpackages;
           }

 1. var EmployerId = Convert.ToInt32(Session["EmployerId"]);
               var getpackage = GetPackage(employerSubscription.ID, EmployerId);

1

FYI আপনি এই ত্রুটিটি পেতে পারেন যদি EF মাইগ্রেশনগুলি কোনও ডিবি কনফিগার করা না দিয়ে চালানোর চেষ্টা করে, উদাহরণস্বরূপ একটি পরীক্ষামূলক প্রকল্পে।

ঘন্টাখানেক ধরে এটি তাড়া করার আগে আমি বুঝতে পেরেছিলাম যে এটি কোনও ক্যোয়ারিতে ত্রুটি ঘটছে, তবে, ক্যোয়ারির কারণে নয়, কারণ যখন মাইগ্রেশনগুলি ডিবি তৈরির চেষ্টা করার জন্য লাথি মেরেছিল।


0

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

তবে আমি আপনাকে দ্রুত ওভারভিউ দিতে চেয়েছিলাম।

//success on 0 or 1 in the list, returns dafault() of whats in the list if 0
list.SingleOrDefault();
//success on 1 and only 1 in the list
list.Single();

//success on 0-n, returns first element in the list or default() if 0 
list.FirstOrDefault();
//success 1-n, returns the first element in the list
list.First();

//success on 0-n, returns first element in the list or default() if 0 
list.LastOrDefault();
//success 1-n, returns the last element in the list
list.Last();

আরও লিনক এক্সপ্রেশনগুলির জন্য সিস্টেম.লিনক.এক্সপ্রেসেশনগুলি দেখুন

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