Последовательность содержит более одного элемента
У меня возникли проблемы с захватом списка типов "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.