2009-08-10 9 views
88

हैं, मुझे लिंक के माध्यम से "RhsTruck" प्रकार की सूची को पकड़ने और उन्हें प्रदर्शित करने के लिए कुछ समस्याएं हैं।अनुक्रम में एक से अधिक तत्व

RhsTruck सिर्फ प्रॉपर्टीज़ बनाओ गया है, मॉडल, सीरियल आदि ... RhsCustomer है गुण CUSTOMERNAME, CustomerAddress, आदि ...

मैं हो रही त्रुटि "अनुक्रम एक से अधिक तत्व शामिल" रखने के लिए। कोई विचार? क्या मैं इस गलत तरीके से आ रहा हूं?

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

** ** <** **, एसक्यूएल ** शीर्ष() ** कुल फ़ंक्शन के साथ ही लें। 'ले जाएं (1) .SingleOrDefault();' – Megamind

उत्तर

222

समस्या यह है कि आप SingleOrDefault का उपयोग कर रहे हैं। यह विधि केवल तब सफल होगी जब संग्रह में बिल्कुल 0 या 1 तत्व होता है। मेरा मानना ​​है कि आप FirstOrDefault की तलाश में हैं जो इससे कोई फर्क नहीं पड़ता कि संग्रह में कितने तत्व हैं।

+0

धन्यवाद, ऐसा लगता है कि यह चाल –

+7

कैल्विन है, उस स्थिति में आपको इस उत्तर को समाधान –

+21

-1 * के रूप में स्वीकार करना चाहिए "समस्या यह है कि आप सिंगलऑर्डफॉल्ट का उपयोग कर रहे हैं" * - जो मैं इकट्ठा कर सकता हूं उससे ओपी एक ग्राहक आईडी की तलाश में है जो मुझे लगता है (मुझे लगता है) अद्वितीय होना चाहिए, इसलिए, 'SingleOrDefault' वास्तव में 'FirstOrDefault' से अधिक उपयुक्त है। इसके अलावा, इसने वास्तव में ओपी के डेटाबेस डिज़ाइन के साथ एक और गंभीर समस्या उठाई है क्योंकि इससे पता चलता है कि एक ही आईडी के साथ 2 ग्राहक जोड़ना संभव है! – James

20

SingleOrDefault विधि अनुक्रम में एक से अधिक तत्व होने पर Exception फेंकता है।

जाहिर है, GetCustomer में आपकी क्वेरी एक से अधिक मैच ढूंढ रही है। तो आपको या तो अपनी क्वेरी को परिष्कृत करने की आवश्यकता होगी या, संभवतः, यह देखने के लिए अपने डेटा की जांच करें कि आपको किसी दिए गए ग्राहक नंबर के लिए एकाधिक परिणाम क्यों मिल रहे हैं।

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(); 
अधिक Linq भाव के लिए

अगर एफई माइग्रेशन कोई Db साथ कॉन्फ़िगर चलाने के लिए एक टेस्ट परियोजना में उदाहरण के लिए कोशिश करता है FYI करें कि आप ये त्रुटि प्राप्त कर सकते हैं System.Linq.Expressions

0

पर एक नजर है।

यह पता लगाए जाने से पहले घंटों तक इसका पीछा किया गया कि यह एक प्रश्न पर त्रुटि कर रहा था, लेकिन, क्वेरी के कारण नहीं, बल्कि जब यह माइग्रेशन डीबी बनाने की कोशिश करने के लिए लात मार गया था।

संबंधित मुद्दे