2009-08-10 26 views
88

Sto riscontrando alcuni problemi con l'acquisizione di un elenco di tipo "RhsTruck" tramite Linq e la visualizzazione.La sequenza contiene più di un elemento

RhsTruck appena ha properites marca, modello, di serie, ecc ... RhsCustomer ha proprietà CustomerName, CustomerAddress, ecc ...

continuo a ricevere l'errore "sequenza contiene più di un elemento". Qualche idea? Mi sto avvicinando a questo nel modo sbagliato?

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

Utilizzare ** take <> **, lo stesso con SQL ** Top() ** funzione di aggregazione, '.Take (1) .SingleOrDefault();' – Megamind

risposta

222

Il problema è che si sta usando SingleOrDefault. Questo metodo avrà successo solo quando le raccolte contengono esattamente 0 o 1 elemento. Credo che tu stia cercando FirstOrDefault che avrà successo indipendentemente dal numero di elementi presenti nella collezione.

+0

Grazie, sembra aver fatto il trucco –

+7

Calvin, in tal caso dovresti accettare questa risposta come soluzione –

+21

-1 * "Il problema è che stai usando SingleOrDefault" * - da quello che posso raccogliere l'OP è alla ricerca di un ID cliente che (presumo) dovrebbe essere unico, quindi, 'SingleOrDefault' è in realtà più appropriato di' FirstOrDefault'. Inoltre, questo ha effettivamente sollevato un problema più serio con la progettazione del database dell'OP in quanto mostra che è possibile aggiungere 2 clienti con lo stesso ID! – James

20

SingleOrDefault metodo genera un Exception se c'è più di un elemento nella sequenza.

A quanto pare, la tua query nel numero GetCustomer sta trovando più di una corrispondenza. Pertanto, dovrai perfezionare la query o, molto probabilmente, controllare i tuoi dati per capire perché stai ottenendo più risultati per un dato numero di cliente.

0

Come sottolinea @Mehmet, se il risultato restituisce più di 1 elerment, è necessario esaminare i dati in quanto sospetto che non sia stato progettato in base al fatto che i clienti condividono un numero personalizzato.

Ma al punto che volevo darvi una rapida panoramica.

//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(); 

per più espressioni Linq uno sguardo al System.Linq.Expressions

0

FYI è anche possibile ottenere questo errore se EF migrazioni cerca di correre senza Db configurato, ad esempio, in un progetto di test.

Chased questo per ore prima ho capito che si trattava di errore su una query, ma, non a causa della query, ma perché era quando le migrazioni hanno dato il via per provare a creare il Db.

Problemi correlati