Helpex - Trao đổi & giúp đỡ Đăng nhập
122

Tôi đang gặp một số vấn đề với việc lấy danh sách loại "RhsTruck" thông qua Linq và hiển thị chúng.

RhsTruck chỉ có các thuộc tính Make, Model, Serial, v.v. RhsCustomer có các thuộc tính CustomerName, CustomerAddress, v.v.

Tôi tiếp tục nhận được lỗi "Chuỗi chứa nhiều hơn một phần tử". Có ý kiến ​​gì khô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();   
}
122 hữu ích 1 bình luận 193k xem chia sẻ
269

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

269 hữu ích 5 bình luận chia sẻ
24

SingleOrDefaultphương thức ném một Exceptionnếu có nhiều hơn một phần tử trong chuỗi.

Rõ ràng, 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 sẽ cần phải tinh chỉnh truy vấn của mình hoặc, rất có thể, kiểm tra dữ liệu của bạn để xem lý do tại sao bạn nhận được nhiều kết quả cho một số khách hàng nhất định.

24 hữu ích 0 bình luận chia sẻ
7
Use FirstOrDefault insted of SingleOrDefault..

SingleOrDefault trả về một phần tử SINGLE hoặc null nếu không tìm thấy phần tử nào. Nếu 2 phần tử được tìm thấy trong Enumerable của bạn thì nó sẽ ném ra ngoại lệ mà bạn đang thấy

FirstOrDefault trả về phần tử ĐẦU TIÊN mà nó tìm thấy hoặc null nếu không tìm thấy phần tử nào. vì vậy nếu có 2 phần tử khớp với vị ngữ của bạn thì phần tử thứ hai sẽ bị bỏ qua

   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);
7 hữu ích 0 bình luận chia sẻ
2

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

Đã theo đuổi điều này trong nhiều giờ trước khi tôi phát hiện ra rằng nó đang mắc lỗi trong một truy vấn, nhưng, không phải vì truy vấn mà vì đó là khi Migrations bắt đầu cố gắng tạo Db.

2 hữu ích 0 bình luận chia sẻ
0

Như @Mehmet đã chỉ ra, nếu kết quả của bạn trả về nhiều hơn 1 thư thì bạn cần phải xem xét dữ liệu của mình vì tôi nghi ngờ rằng dữ liệu của bạn không phải do thiết kế mà bạn có khách hàng chia sẻ một số tùy chỉnh.

Nhưng tôi muốn cung cấp cho bạn một cái nhìn tổng quan nhanh chóng.

//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, hãy xem System.Linq.Expressions

0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ c# .net asp.net linq , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading