Estou tendo alguns problemas para obter uma lista do tipo "RhsTruck" por meio do Linq e fazer com que sejam exibidos.
RhsTruck só tem as propriedades Marca, Modelo, Serial etc ... RhsCustomer tem as propriedades CustomerName, CustomerAddress, etc ...
Continuo recebendo o erro "A sequência contém mais de um elemento". Alguma ideia? Estou abordando isso da maneira errada?
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();
Respostas:
O problema é que você está usando
SingleOrDefault
. Este método só terá sucesso quando as coleções contiverem exatamente 0 ou 1 elemento. Eu acredito que você está procurandoFirstOrDefault
aquele que terá sucesso, não importa quantos elementos estejam na coleção.fonte
SingleOrDefault
é na verdade mais apropriado do queFirstOrDefault
. Além disso, isso realmente levantou um problema mais sério com o design do banco de dados do OP, pois mostra que é possível adicionar 2 clientes com o mesmo ID!SingleOrDefault
de funcionar. É verdade que pode ser possível ter um design de banco de dados melhor aqui, mas isso parece mais apropriado como um comentário sobre o OP e não como -1 em uma resposta.SingleOrDefault
está lançando uma exceção porque há uma inconsistência entre o que o método espera e o que está encontrando. Portanto, embora sua resposta interrompa a exceção, para mim, ela não resolve o problema, é mais um cartão de "saia da prisão", portanto -1.SingleOrDefault
então cai quando você espera que uma coleção tenha 0 ou 1 itens e deseja verificar se isso acontece todas as vezes ...SingleOrDefault
método lança umException
se houver mais de um elemento na sequência.Aparentemente, sua consulta em
GetCustomer
está encontrando mais de uma correspondência. Portanto, você precisará refinar sua consulta ou, provavelmente, verificar seus dados para ver por que está obtendo vários resultados para um determinado número de cliente.fonte
SingleOrDefault retorna um elemento SINGLE ou nulo se nenhum elemento for encontrado. Se 2 elementos forem encontrados em seu Enumerable, ele lança a exceção que você está vendo
FirstOrDefault retorna o FIRST elemento encontrado ou nulo se nenhum elemento for encontrado. então se houver 2 elementos que correspondem ao seu predicado, o segundo é ignorado
fonte
Para sua informação, você também pode obter este erro se o EF Migrations tentar ser executado sem nenhum Db configurado, por exemplo, em um projeto de teste.
Persegui isso por horas antes de descobrir que estava errando em uma consulta, mas, não por causa da consulta, mas porque foi quando o Migrations começou a tentar criar o Db.
fonte
Como @Mehmet está apontando, se o seu resultado retornar mais de 1 elemento, você precisa examinar seus dados, pois suspeito que não é por design que você tenha clientes compartilhando um número personalizado.
Mas, até o ponto, eu queria dar uma visão geral rápida.
para mais expressões Linq, dê uma olhada em System.Linq.Expressions
fonte