如何检查数据库中是否存在条目?调试显示result返回null。
TimeSlots a Collection.我不确定我是否做对了。
以下是我的背景:
var result = await context.Bookings
.SingleOrDefaultAsync(b =>
b.BookDate == booking.BookDate
&& b.TimeSlots == booking.TimeSlots
&& b.RoomId == booking.RoomId);public class Booking
{
public int Id { get; set; }
[Required]
public DateTime BookDate { get; set; }
[Required]
public int RoomId { get; set; }
public Room Room { get; set; }
[Required]
public ICollection<BookingTimeSlot> TimeSlots { get; set; }
[Required]
public ICollection<BookingModule> Modules { get; set; }
public Booking()
{
TimeSlots = new Collection<BookingTimeSlot>();
Modules = new Collection<BookingModule>();
}
}public class BookingTimeSlot
{
public int BookingId { get; set; }
public int TimeSlotId { get; set; }
public Booking Booking { get; set; }
public TimeSlot TimeSlot { get; set; }
}这就是我想要做的输入:
{
"RoomId": 1,
"BookDate": "2020-10-27",
"TimeSlots": [1, 3],
"Modules": [1]
}发布于 2020-11-17 11:28:30
我已经找到了解决问题的办法。我使用TimeSlotId比较Intersect,如果有交集,则返回true。
public bool BookingExist(Booking booking)
{
var resultContext = context.Bookings
.Where(b => b.Room.Id == booking.RoomId && b.BookDate == booking.BookDate)
.SelectMany(b => b.TimeSlots.Select(bt => bt.TimeSlotId))
.AsEnumerable();
var resultInput = booking.TimeSlots.Select(bt => bt.TimeSlotId);
if (resultContext.Intersect(resultInput).Count() > 0)
return true;
else
return false;
}发布于 2020-11-01 17:53:45
你的问题不清楚你是在寻找副本还是得到第一个结果。
第二,我认为您丢失了模型中的主键,或者您正在使用复合键,不管是哪种方式,它的良好读取都可以帮助您修复这个问题。
//With Linq and EF find and process duplicates
// assuming Id is your primary key - [please fix this, some info for you][1]
var duplicateBookings = context.Bookings.GroupBy(i => i.id)
.Where(x => x.Count() > 1)
.Select(val => val.Key); // or .SelectMany(i => i.ToList());
// do what you need
foreach(var dupes in duplicateBookings )
{
//process or do what you need
context.Bookings.DeleteObject(dupes); // for e.g. delete duplicate bookings
}如果你只想要第一个结果,那就把唱歌改为先唱。
var result = await context.Bookings
.FirstOrDefaultAsync(b => //first result
b.BookDate == booking.BookDate
&& b.TimeSlots == booking.TimeSlots
&& b.RoomId == booking.RoomId);发布于 2020-11-01 18:36:52
那么,在大多数情况下,数据库中的引用完整性并不能解决这些问题,而且在绝大多数情况下,RI无论如何都不会被使用。原因是,这不是RI的工作,但更糟糕的是,对于用户界面来说,这种违反RI的行为发生得太晚了,因为用户界面告诉用户这样的预订是不可能完成的。换句话说,你不去做预订,祈求好运,希望能把数据写出来。
您要做的是提供一个UI,当用户选择预订日期时,您会给出这样一个预订无法进行的反馈,因此还没有发生任何数据库写入或更新--因此这是一个UI问题,而不是真正的数据库RI问题。而且,即使这是数据库RI问题,您也必须尝试编写数据,而且用户通常只是检查和询问某个特定的预订日期--而不是实际预订所必需的。
根据这个逻辑可以找到预订冲突:
RequestStartDate <= EndDate
and
RequestEndDate >= StartDate 因此,任何重叠,甚至一个完整的括号,将发现与上述简单的查询。
所以用上面的?然后,有了房间号和预订日期范围的列表,就会发现与该房间的碰撞:
@dtRequestStartDate = "Enter start Date"
@dtRequestEndDate = "Enter end date"
@RoomNum = Room number
strSQL = SELECT * from tblBookings where
(@dtRequestStartDate <= RoomEndDate)
AND
(@dtRequestEndDate >= RoomStartDate)
AND
(@RoomNum = RoomNumber)
If above row.Count > 0 then
message = Sorry, you cannot book that room因此,您要做的是在预订之前检查,如果上面返回行,则不允许预订。只要您不允许重复预订,那么上述简单的逻辑将始终工作,并始终防止预订与碰撞。
https://stackoverflow.com/questions/64633162
复制相似问题