序列包含多个元素

105 .net c# linq asp.net

我在通过Linq获取"RhsTruck"类型列表并让它们显示时遇到了一些问题.

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();   
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 242

问题是你正在使用SingleOrDefault.只有当集合包含0或1个元素时,此方法才会成功.FirstOrDefault无论集合中有多少元素,我相信您正在寻找哪种成功.

  • @James,OP表示我的答案是正确的,并且异常明确指出该集合有多个元素阻止`SingleOrDefault`工作.确实*可能*可以在这里有更好的数据库设计,但这似乎更适合作为对OP的评论而不是答案的-1. (26认同)
  • -1*"问题是你正在使用SingleOrDefault"* - 从我可以收集到的OP中寻找的客户ID(我假设)应该是唯一的,因此,`SingleOrDefault`实际上比`FirstOrDefault`更合适.此外,这实际上引起了OP数据库设计的一个更严重的问题,因为它表明可以添加2个具有相同ID的客户! (23认同)
  • IMO的根本问题是最终的数据库设计,因为它表明可以将2个唯一的客户ID添加到数据库中.`SingleOrDefault`抛出一个异常,因为方法期望和它发现的内容之间存在不一致.因此,虽然你的答案会停止异常,但对我来说,它实际上并没有解决问题,而是更多的是"退出监狱"卡因此-1. (9认同)
  • 凯文,在这种情况下,你应该接受这个答案作为解决方案 (8认同)
  • 这是误导!当你期望一个集合有0或1个项目并且你想要每次都检查这种情况时,`SingleOrDefault`的用法会落入... (2认同)

Meh*_*ras 23

SingleOrDefaultException如果序列中有多个元素,则抛出一个方法.

显然,您的查询GetCustomer是找到多个匹配项.因此,您需要优化查询,或者最有可能检查您的数据,以了解您为什么获得给定客户编号的多个结果.


小智 8

Use FirstOrDefault insted of SingleOrDefault..
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)