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