C#Linq查询返回多个匹配项
只有当船不在C#Linq查询返回多个匹配项,c#,linq,C#,Linq,只有当船不在RentBoat表中并且IsOnRent列上的值设置为true时,我才想从boat表中获取一个船项目 这是我目前的代码: db.Boats.SingleOrDefault(x => !db.RentBoats.Any(s => s.BoatID == x.BoatID && s.IsOnRent == true)); 我得到的错误是: 序列包含几个元素 我的代码哪里错了?任何帮助都会很好 本质上,我想要这个查询做什么,但我希望它从Id返回匹配的项或返回n
RentBoat
表中并且IsOnRent
列上的值设置为true时,我才想从boat
表中获取一个船项目
这是我目前的代码:
db.Boats.SingleOrDefault(x => !db.RentBoats.Any(s => s.BoatID == x.BoatID && s.IsOnRent == true));
我得到的错误是:
序列包含几个元素
我的代码哪里错了?任何帮助都会很好
本质上,我想要这个查询做什么,但我希望它从Id返回匹配的项或返回null。(单个项不是列表)
编辑
我最后就是这样解决的:
using (var db = new BoatContext())
{
List<RentBoat> IsBoatRented = db.RentBoats.Where(x => x.BoatID == boatId && x.IsOnRent == true).ToList();
if (IsBoatRented.Count() == 0)
{
returnedBoat = db.Boats.FirstOrDefault(x => x.BoatID == boatId);
}
}
使用(var db=new BoatContext())
{
列出isboatrent=db.rentboots.Where(x=>x.BoatID==BoatID&&x.IsOnRent==true);
如果(IsBoatRented.Count()==0)
{
returnedBoat=db.Boats.FirstOrDefault(x=>x.BoatID==BoatID);
}
}
我知道它没有一个查询那么高效或好看。但无法通过一个查询完成此操作。如果有人可以将这些查询重写为一个查询。我可以帮忙了。我将不胜感激 使用
SingleOrDefault
就是说应该只有一条记录与条件匹配。错误表示数据库中有多行符合您的要求
如果您想要一个结果,但并不真正关心是否只有一个成功匹配,请使用
FirstOrDefault
。如果有一个或多个记录与谓词匹配,则返回一行;如果没有,则返回null。您应该这样尝试,获取所有未租用的船只(您的查询可能多次给您相同id的船只),并通过
var allNotRendedBoats= from b in db.Boats
.Where(boat => !db.RentBoats
.Any(x => x.BoatID == boat.BoatID && x.IsOnRent == true))
group b by b.BoatID into g
select g.First();
如果它不会多次返回同一条船,而只是将条件置于何处,而不是SingleOrDefault
为您提供输出
查看类似于
的问题代码>条件
db.Boats.SingleOrDefault(x =>
!db.RentBoats.Any(s => s.BoatID == x.BoatID && s.IsOnRent == true));
应该是
db.Boats.SingleOrDefault(x =>
db.RentBoats.Any(s => s.BoatID == x.BoatID && s.IsOnRent == true));
如果你这样做,代码>然后会请求多个元素
所以,如果我看一下你的代码,那么你似乎是在请求所有不符合这个条件的元素!db.rentboots.Any(s=>s.BoatID==x.BoatID&&s.IsOnRent==true))
当您只需要一个元素时,SingleOrDefault
非常有用
如果您想获得第一个元素,那么我建议使用FirstOrDefault
我完全忽略了这一点。抢手货但即使有了这个解决方案,我认为可以放心地假设有多条船可供出租,SingleOrDefault
应该是FirstOrDefault
@MarcinJuraszek-谢谢,我在回答中更新了同样的内容…:)希望这对他有帮助在RentBoat表中有很多相同Id的船。当我从表中获得船时,我想交叉匹配,我没有得到已经出租的船。@AllramEst-如果你想找出问题所在,那么我建议你应用where条件,并检查条件返回的元素数“…@AllramEst-你能试着让我知道吗…添加wehere条件并检查长度和打印元素是否已返回…@GiladGreen-看起来不象是重复的,船只没有导航属性,租赁船只
?你能粘贴你的船只类吗…可能是帮助,我们可以在哪里重新返回?”??课堂上更新的问题
db.Boats.SingleOrDefault(x =>
db.RentBoats.Any(s => s.BoatID == x.BoatID && s.IsOnRent == true));