首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查数据库中是否存在任何匹配的房间、BookDate和RoomId?

如何检查数据库中是否存在任何匹配的房间、BookDate和RoomId?
EN

Stack Overflow用户
提问于 2020-11-01 14:46:40
回答 3查看 94关注 0票数 0

如何检查数据库中是否存在条目?调试显示result返回null

TimeSlots a Collection.我不确定我是否做对了。

以下是我的背景:

代码语言:javascript
复制
var result = await context.Bookings
    .SingleOrDefaultAsync(b => 
        b.BookDate == booking.BookDate 
        && b.TimeSlots == booking.TimeSlots 
        && b.RoomId == booking.RoomId);
代码语言:javascript
复制
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>();
    }
}
代码语言:javascript
复制
public class BookingTimeSlot
{
    public int BookingId { get; set; }    
    public int TimeSlotId { get; set; }
    public Booking Booking { get; set; }
    public TimeSlot TimeSlot { get; set; }
}

这就是我想要做的输入:

代码语言:javascript
复制
{
    "RoomId": 1,
    "BookDate": "2020-10-27",
    "TimeSlots": [1, 3],
    "Modules": [1]
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-17 11:28:30

我已经找到了解决问题的办法。我使用TimeSlotId比较Intersect,如果有交集,则返回true。

代码语言:javascript
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2020-11-01 17:53:45

你的问题不清楚你是在寻找副本还是得到第一个结果。

第二,我认为您丢失了模型中的主键,或者您正在使用复合键,不管是哪种方式,它的良好读取都可以帮助您修复这个问题。

代码语言:javascript
复制
//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
}

如果你只想要第一个结果,那就把唱歌改为先唱。

代码语言:javascript
复制
var result = await context.Bookings
    .FirstOrDefaultAsync(b =>        //first result
        b.BookDate == booking.BookDate 
        && b.TimeSlots == booking.TimeSlots 
        && b.RoomId == booking.RoomId);
票数 1
EN

Stack Overflow用户

发布于 2020-11-01 18:36:52

那么,在大多数情况下,数据库中的引用完整性并不能解决这些问题,而且在绝大多数情况下,RI无论如何都不会被使用。原因是,这不是RI的工作,但更糟糕的是,对于用户界面来说,这种违反RI的行为发生得太晚了,因为用户界面告诉用户这样的预订是不可能完成的。换句话说,你不去做预订,祈求好运,希望能把数据写出来。

您要做的是提供一个UI,当用户选择预订日期时,您会给出这样一个预订无法进行的反馈,因此还没有发生任何数据库写入或更新--因此这是一个UI问题,而不是真正的数据库RI问题。而且,即使这是数据库RI问题,您也必须尝试编写数据,而且用户通常只是检查和询问某个特定的预订日期--而不是实际预订所必需的。

根据这个逻辑可以找到预订冲突:

代码语言:javascript
复制
RequestStartDate <= EndDate 
and 
RequestEndDate >= StartDate 

因此,任何重叠,甚至一个完整的括号,将发现与上述简单的查询。

所以用上面的?然后,有了房间号和预订日期范围的列表,就会发现与该房间的碰撞:

代码语言:javascript
复制
@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

因此,您要做的是在预订之前检查,如果上面返回行,则不允许预订。只要您不允许重复预订,那么上述简单的逻辑将始终工作,并始终防止预订与碰撞。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64633162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档