У меня возникли проблемы с получением списка типа "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();
}
.Take(1).SingleOrDefault();
Ответы:
Проблема в том, что вы используете
SingleOrDefault
. Этот метод будет успешным только тогда, когда коллекции содержат ровно 0 или 1 элемент. Я считаю, что вы ищете то,FirstOrDefault
что будет успешным, независимо от того, сколько элементов в коллекции.источник
SingleOrDefault
самом деле более уместен, чемFirstOrDefault
. Кроме того, это на самом деле подняло более серьезную проблему с дизайном базы данных OP, поскольку показывает, что можно добавить 2 клиентов с одинаковым идентификатором!SingleOrDefault
когда-либо работать. Верно, что здесь можно было бы иметь лучший дизайн базы данных, но это кажется более подходящим в качестве комментария к OP, а не -1 в ответе.SingleOrDefault
генерирует исключение, потому что существует несоответствие между тем, что ожидает метод, и тем, что он обнаруживает. Таким образом, хотя ваш ответ останавливает исключение, для меня он на самом деле не решает проблему, это скорее карта «выйти из тюрьмы бесплатно», отсюда и -1.SingleOrDefault
then относится к случаям, когда вы ожидаете, что в коллекции будет 0 или 1 элемент, и вы хотите проверять, что это происходит каждый раз ...SingleOrDefault
генерирует,Exception
если в последовательности более одного элемента.Очевидно, ваш запрос в
GetCustomer
обнаруживает более одного совпадения. Таким образом, вам нужно будет либо уточнить свой запрос, либо, скорее всего, проверить свои данные, чтобы понять, почему вы получаете несколько результатов для данного номера клиента.источник
SingleOrDefault возвращает SINGLE элемент или null, если элемент не найден. Если в вашем Enumerable обнаружены 2 элемента, он выдает исключение, которое вы видите
FirstOrDefault возвращает ПЕРВЫЙ найденный элемент или null, если элемент не найден. поэтому, если есть 2 элемента, которые соответствуют вашему предикату, второй игнорируется
источник
К вашему сведению, вы также можете получить эту ошибку, если EF Migrations пытается запустить без настроенной базы данных, например, в тестовом проекте.
Преследовал это в течение нескольких часов, прежде чем я понял, что это была ошибка в запросе, но не из-за запроса, а потому, что это произошло, когда Migrations запустил, чтобы попытаться создать Db.
источник
Как указывает @Mehmet, если ваш результат возвращает более одного сообщения, вам необходимо изучить ваши данные, поскольку я подозреваю, что у вас есть клиенты, разделяющие номер клиента, не по дизайну.
Но я хотел дать вам краткий обзор.
для получения дополнительных выражений Linq посмотрите System.Linq.Expressions
источник