序列包含多个元素

时间:2009-08-10 19:32:07

标签: c# .net asp.net linq

我在通过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();   
}

5 个答案:

答案 0 :(得分:236)

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

答案 1 :(得分:23)

如果序列中有多个元素,

SingleOrDefault方法将抛出Exception

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

答案 2 :(得分:1)

仅供参考,如果EF Migrations尝试在未配置Db的情况下运行,例如在测试项目中,您也会收到此错误。

在我发现它在查询中出错之前已经追了好几个小时,但是,不是因为查询而是因为它是在迁移尝试创建Db的时候。

答案 3 :(得分:1)

Use FirstOrDefault insted of SingleOrDefault..

SingleOrDefault返回SINGLE元素,如果没有找到元素,则返回null。如果在您的Enumerable中找到2个元素,则它会抛出您正在看到的异常

FirstOrDefault返回它找到的FIRST元素,如果没有找到元素,则返回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);

答案 4 :(得分:0)

正如@Mehmet指出的那样,如果你的结果返回超过1个elerment,那么你需要查看你的数据,因为我怀疑你的设计并不是你有客户共享客户数量。

但是我想给你一个快速概述。

//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表达式,请查看System.Linq.Expressions