LINQ 相关错误“无法创建 'System.Object' 类型的常量值。在此上下文中仅支持基本类型或枚举类型
LINQ related error "Unable to create a constant value of type 'System.Object'. Only primitive types or enumeration types are supported in this context
我有一些代码可以从我的数据库中选择一些值。我有一个 IQueryable 请求,其中包含一个 ICollection 房间。
我想要一个List<ICollection<rooms>>
。我已尝试以下操作,但收到上述错误。
有什么想法吗??
public ActionResult _roomChecker(checkRooms JSONdata){
var rooms = db.rooms.Include(r=>r.building).Include(r=>r.facilities);
rooms = rooms.Where(r => r.capacity >= JSONdata.capacity);
if (JSONdata.type != "Any")
{
rooms = rooms.Where(r => r.roomType.Equals(JSONdata.type));
}
if (JSONdata.park != "Any")
{
rooms = rooms.Where(r => r.building.park.Equals(JSONdata.park));
}
if (JSONdata.facilities != null)
{
for (var i = 0; i < JSONdata.facilities.Length; i++)
{
rooms = rooms.Where(r => r.facilities.Any(f => f.facilityName.Equals(JSONdata.facilities[i])));
}
}
var proposedRequest = db.requests.Include(r => r.rooms);
proposedRequest = proposedRequest.Where(r=>r.booked.Equals(1));
proposedRequest = proposedRequest.Where(r => r.roundID.Equals(JSONdata.roundID));
proposedRequest = proposedRequest.Where(r => r.day.Equals(JSONdata.day));
proposedRequest = proposedRequest.Where(s => s.start < JSONdata.start + JSONdata.length && s.start + s.length > JSONdata.start);
int[] standardWeeks = new int[12] {1,2,3,4,5,6,7,8,9,10,11,12};
var containsStandard = standardWeeks.Intersect(JSONdata.weeks);
if (containsStandard.Count()!=0)
{
proposedRequest = proposedRequest.Where(r => r.weeks_request.Any(f => JSONdata.weeks.Contains(f.week)) || r.weeks.Equals(1));
}
else {
proposedRequest = proposedRequest.Where(r => r.weeks_request.Any(f => JSONdata.weeks.Contains(f.week)));
}
//ERROR OCCURS ON THIS LINE BELOW
List<ICollection<room>> bookedRooms = proposedRequest.Select(r => r.rooms).ToList();
var deptRooms = db.rooms.Include(r => r.building).Include(r => r.facilities).Where(r => r.belongsTo.Equals(JSONdata.deptCode));
roomCheckerObject suitableRooms = new roomCheckerObject();
suitableRooms.code = JSONdata.deptCode;
suitableRooms.roomNo = JSONdata.roomNo;
suitableRooms.RequestNo = JSONdata.RequestNo;
if(rooms.Count() >0){
suitableRooms.rooms = rooms.ToList();
var buildings = rooms.Select(r => r.building).Distinct();
suitableRooms.buildings = buildings.ToList();
}
if(bookedRooms.Count() >0){
suitableRooms.bookedRooms = bookedRooms;
}
if(deptRooms.Count() >0){
suitableRooms.deptRooms = deptRooms.ToList();
}
return PartialView(suitableRooms);}
很难说出到底是什么导致了错误,但我可以看到 3 个可能的罪魁祸首:
1) 您正在使用 .Equals()
和 Linq to entities (L2E) 查询。这可能会导致问题,请参阅 here。
2) 你说错误发生在声明List<ICollection<room>>
的那一行。在这一行中,您在任何 L2E 语句中第一次调用 .ToList()
。只有现在您的 L2E 查询才会针对数据库执行 (see EF Query Execution),这意味着之前的 L2E 语句中的任何错误(使用 .Equals()
)都可能引发异常。
3) proposedRequest.Select(r => r.rooms).ToList();
真的 return 是 List<ICollection<room>>
吗?尝试使用 .SelectMany()
(尽管这可能会产生不良影响)或进行完整性检查,将 List<ICollection<room>>
更改为 var
以查看查询将 return.
我有一些代码可以从我的数据库中选择一些值。我有一个 IQueryable 请求,其中包含一个 ICollection 房间。
我想要一个List<ICollection<rooms>>
。我已尝试以下操作,但收到上述错误。
有什么想法吗??
public ActionResult _roomChecker(checkRooms JSONdata){
var rooms = db.rooms.Include(r=>r.building).Include(r=>r.facilities);
rooms = rooms.Where(r => r.capacity >= JSONdata.capacity);
if (JSONdata.type != "Any")
{
rooms = rooms.Where(r => r.roomType.Equals(JSONdata.type));
}
if (JSONdata.park != "Any")
{
rooms = rooms.Where(r => r.building.park.Equals(JSONdata.park));
}
if (JSONdata.facilities != null)
{
for (var i = 0; i < JSONdata.facilities.Length; i++)
{
rooms = rooms.Where(r => r.facilities.Any(f => f.facilityName.Equals(JSONdata.facilities[i])));
}
}
var proposedRequest = db.requests.Include(r => r.rooms);
proposedRequest = proposedRequest.Where(r=>r.booked.Equals(1));
proposedRequest = proposedRequest.Where(r => r.roundID.Equals(JSONdata.roundID));
proposedRequest = proposedRequest.Where(r => r.day.Equals(JSONdata.day));
proposedRequest = proposedRequest.Where(s => s.start < JSONdata.start + JSONdata.length && s.start + s.length > JSONdata.start);
int[] standardWeeks = new int[12] {1,2,3,4,5,6,7,8,9,10,11,12};
var containsStandard = standardWeeks.Intersect(JSONdata.weeks);
if (containsStandard.Count()!=0)
{
proposedRequest = proposedRequest.Where(r => r.weeks_request.Any(f => JSONdata.weeks.Contains(f.week)) || r.weeks.Equals(1));
}
else {
proposedRequest = proposedRequest.Where(r => r.weeks_request.Any(f => JSONdata.weeks.Contains(f.week)));
}
//ERROR OCCURS ON THIS LINE BELOW
List<ICollection<room>> bookedRooms = proposedRequest.Select(r => r.rooms).ToList();
var deptRooms = db.rooms.Include(r => r.building).Include(r => r.facilities).Where(r => r.belongsTo.Equals(JSONdata.deptCode));
roomCheckerObject suitableRooms = new roomCheckerObject();
suitableRooms.code = JSONdata.deptCode;
suitableRooms.roomNo = JSONdata.roomNo;
suitableRooms.RequestNo = JSONdata.RequestNo;
if(rooms.Count() >0){
suitableRooms.rooms = rooms.ToList();
var buildings = rooms.Select(r => r.building).Distinct();
suitableRooms.buildings = buildings.ToList();
}
if(bookedRooms.Count() >0){
suitableRooms.bookedRooms = bookedRooms;
}
if(deptRooms.Count() >0){
suitableRooms.deptRooms = deptRooms.ToList();
}
return PartialView(suitableRooms);}
很难说出到底是什么导致了错误,但我可以看到 3 个可能的罪魁祸首:
1) 您正在使用 .Equals()
和 Linq to entities (L2E) 查询。这可能会导致问题,请参阅 here。
2) 你说错误发生在声明List<ICollection<room>>
的那一行。在这一行中,您在任何 L2E 语句中第一次调用 .ToList()
。只有现在您的 L2E 查询才会针对数据库执行 (see EF Query Execution),这意味着之前的 L2E 语句中的任何错误(使用 .Equals()
)都可能引发异常。
3) proposedRequest.Select(r => r.rooms).ToList();
真的 return 是 List<ICollection<room>>
吗?尝试使用 .SelectMany()
(尽管这可能会产生不良影响)或进行完整性检查,将 List<ICollection<room>>
更改为 var
以查看查询将 return.