2009-08-10 30 views
88

Tôi đang gặp một số vấn đề với việc lấy danh sách loại "RhsTruck" qua Linq và hiển thị chúng.Trình tự chứa nhiều hơn một thành phần

RhsTruck chỉ đã properites, Kiểu, Serial vv ... RhsCustomer có tính CustomerName, CustomerAddress, vv ...

tôi tiếp tục nhận được lỗi "Chuỗi chứa nhiều hơn một yếu tố". Bất kỳ ý tưởng? Tôi đang tiếp cận điều này một cách sai lầm?

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

Sử dụng ** mất <> **, giống với hàm SQL ** Hàm đầu() **, '.Take (1) .SingleOrDefault();' – Megamind

Trả lời

222

Vấn đề là bạn đang sử dụng SingleOrDefault. Phương thức này sẽ chỉ thành công khi các bộ sưu tập chứa chính xác phần tử 0 hoặc 1. Tôi tin rằng bạn đang tìm kiếm FirstOrDefault sẽ thành công bất kể có bao nhiêu phần tử trong bộ sưu tập.

+0

Cảm ơn, điều này dường như đã thực hiện thủ thuật –

+7

Calvin, trong trường hợp đó bạn nên chấp nhận câu trả lời này như một giải pháp –

+21

-1 * "Vấn đề là bạn đang sử dụng SingleOrDefault" * - từ những gì tôi có thể thu thập OP đang tìm kiếm một id khách hàng mà (tôi giả định) nên là duy nhất, do đó, 'SingleOrDefault' thực sự phù hợp hơn' FirstOrDefault'. Ngoài ra, điều này đã thực sự đưa ra một vấn đề nghiêm trọng hơn với thiết kế cơ sở dữ liệu của OP vì nó cho thấy rằng có thể thêm 2 khách hàng với cùng một ID! – James

20

SingleOrDefault phương pháp ném Exception nếu có nhiều hơn một phần tử trong chuỗi.

Dường như, truy vấn của bạn trong GetCustomer đang tìm nhiều hơn một kết quả phù hợp. Vì vậy, bạn cần phải tinh chỉnh truy vấn của mình hoặc, rất có thể, hãy kiểm tra dữ liệu của bạn để xem lý do bạn nhận được nhiều kết quả cho một số khách hàng nhất định.

0

Khi @Mehmet chỉ ra, nếu kết quả của bạn quay trở lại sau đó 1 elerment thì bạn cần phải nhìn vào dữ liệu của bạn vì tôi nghi ngờ rằng nó không theo thiết kế mà bạn có khách hàng chia sẻ một customernumber.

Nhưng đến thời điểm tôi muốn cung cấp cho bạn tổng quan nhanh.

//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(); 

để biết thêm các biểu thức LINQ có một cái nhìn tại System.Linq.Expressions

0

FYI bạn cũng có thể nhận được lỗi này nếu EF Migrations cố gắng để chạy không có Db cấu hình, ví dụ như trong một dự án thử nghiệm.

Theo dõi điều này trong nhiều giờ trước khi tôi phát hiện ra rằng nó đã bị lỗi trên truy vấn, nhưng không phải do truy vấn mà vì đó là thời điểm di chuyển bắt đầu để cố gắng tạo Db.

Các vấn đề liên quan