views:

3949

answers:

2

I'm having some issues with grabbing a list of type "RhsTruck" through Linq and getting them to display.

RhsTruck just has properites Make, Model, Serial etc... RhsCustomer has properties CustomerName, CustomerAddress, etc...

I keep getting the error "Sequence contains more than one element". Any ideas? Am I approaching this the wrong way?

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

            }
+7  A: 

The problem is that you are using SingleOrDefault. This method will only succeed when the collections contains exactly 0 or 1 element. I believe you are looking for FirstOrDefault which will succeed no matter how many elements are in the collection.

JaredPar
Thanks, this seems to have done the trick
Calvin, in that case you should accept this answer as a solution
Dejan Milicic
+1  A: 

SingleOrDefault method throws an exception if there is more than one element in the sequence. Apparently, your query in GetCustomer is finding more than one match. So you will either need to refine your query or most likely check your data to see why you're getting multiple results for a given customer number.

Mehmet Aras