시퀀스에 둘 이상의 요소가 포함되어 있습니다.
Linq를 통해 "RhsTruck" 유형의 목록을 가져와 표시하는 데 문제가 있습니다.
RhsTruck에는 제조사, 모델, 시리얼 등이 있습니다.RhsCustomer는 <고객명>님, <고객주소> 등의 속성을 가지고 있습니다.
"시퀀스에 여러 요소가 포함되어 있습니다"라는 오류가 계속 표시됩니다(타입).InvalidOperationException
생각나는 거 있어요?제가 잘못 접근한 건가요?
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();
}
사용하고 있는 것이 문제입니다.이 메서드는 컬렉션에 정확히 0 또는1개의 요소가 포함되어 있는 경우에만 성공합니다.컬렉션에 몇 가지 요소가 있더라도 어떤 것이 성공할지 찾고 있다고 생각합니다.
SingleOrDefault
메서드는 를 던집니다.Exception
시퀀스 내에 여러 요소가 있는 경우.
듣자하니, 당신의 질문은GetCustomer
일치하는 것을 두 개 이상 찾는 것입니다.따라서 쿼리를 세분화하거나 데이터를 확인하여 특정 고객 번호에 대해 여러 개의 결과를 얻는 이유를 확인해야 합니다.
Use FirstOrDefault insted of SingleOrDefault..
SingleOrDefault는 SINGLE 요소를 반환하거나 요소를 찾을 수 없는 경우 null을 반환합니다.Enumerable에 2개의 요소가 있는 경우 표시되는 예외가 느려집니다.
FirstOrDefault는 발견된 첫 번째 요소를 반환하고 요소가 없는 경우 null을 반환합니다.따라서 술어와 일치하는 요소가 2개 있으면 두 번째 요소는 무시됩니다.
public int GetPackage(int id,int emp)
{
int getpackages=Convert.ToInt32(EmployerSubscriptionPackage.GetAllData().Where(x
=> x.SubscriptionPackageID ==`enter code here` id && x.EmployerID==emp ).FirstOrDefault().ID);
return getpackages;
}
1. var EmployerId = Convert.ToInt32(Session["EmployerId"]);
var getpackage = GetPackage(employerSubscription.ID, EmployerId);
참고로 EF Migrations가 테스트 프로젝트 등에서 DB를 구성하지 않고 실행하려고 할 경우에도 이 오류가 발생할 수 있습니다.
쿼리에서 오류가 발생하고 있다는 것을 알기 전에 몇 시간 동안 추적했지만, 쿼리 때문이 아니라 마이그레이션이 DB를 생성하려고 했을 때였습니다.
@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 식을 보려면 시스템을 참조하십시오.Linq.식
언급URL : https://stackoverflow.com/questions/1256757/sequence-contains-more-than-one-element
'programing' 카테고리의 다른 글
vb.net 에서 에 대한 차단/종료 중첩 (0) | 2023.06.06 |
---|---|
형식을 사용하여 문자열을 작성하는 방법 (0) | 2023.04.22 |
IConfiguration에 GetValue에 대한 정의가 없습니다. (0) | 2023.04.22 |
원자 속성과 비원자 속성의 차이점은 무엇입니까? (0) | 2023.04.22 |
Git - 모든 위치에서 node_modules 폴더 무시 (0) | 2023.04.22 |