Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Linq查询返回多个匹配项_C#_Linq - Fatal编程技术网

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));