Последовательность содержит более одного элемента

У меня возникли проблемы с захватом списка типов "RhsTruck" через Linq и их отображением.

RhsTruck имеет свои собственные свойства Make, Model, Serial и т.д. 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

Проблема заключается в том, что вы используете SingleOrDefault. Этот метод будет успешным только тогда, когда коллекции содержат ровно 0 или 1 элемент. Я считаю, что вы ищете FirstOrDefault, который будет успешным независимо от количества элементов в коллекции.

Ответ 2

SingleOrDefault метод выбрасывает Exception, если в последовательности содержится более одного элемента.

По-видимому, ваш запрос в GetCustomer находит несколько совпадений. Поэтому вам нужно либо уточнить свой запрос, либо, скорее всего, проверить свои данные, чтобы узнать, почему вы получаете несколько результатов для данного номера клиента.

Ответ 3

Как указывает @Mehmet, если ваш результат возвращается больше 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 смотрите System.Linq.Expressions

Ответ 4

FYI вы также можете получить эту ошибку, если EF Migrations пытается запустить без настройки Db, например, в тестовом проекте.

Chased this в течение нескольких часов, прежде чем я понял, что это ошибка при запросе, но не из-за запроса, а потому, что это было, когда Migrations начали использовать Db.