具有实体框架查询的复杂linq

时间:2015-09-15 12:19:24

标签: sql entity-framework linq

如何为此问题编写where子句?

我希望获得一份业务列表,其中各自的员工有时间可以在当天进行特定服务。

实施例: 有人在周四下午3点搜索提供服务x的商家。它需要检查每个员工的可用性,预订以及完成服务所需的时间(ServiceEmployee.minutes),这是预订长度。

这是我到目前为止所做的:

public List<SearchModel.Result> GetServices(SearchModel.Request model)
{
    var geo = DataUtility.GetGeo(model.lat, model.lng);

    var results = (from b in _db.Businesses
                   join ad in _db.Addresses on b.addressId equals ad.addressId
                   join e in _db.Employees on b.businessId equals e.businessId
                   join av in _db.Availabilities on e.employeeId equals av.employeeId
                   join se in _db.ServiceEmployees on e.employeeId equals se.employeeId
                   join s in _db.Services on se.serviceId equals s.serviceId

                   where s.serviceId.Equals(model.serviceId) //service required
                   && av.day.Equals(model.date.DayOfWeek) //day of the week required

                   //how to write the below where clause??

                   //and has at least one slot of time available (no bookings) that will fit the service time length (minutes)
                   //and is not over the employee's shift (Availability.endAt)
                   //

                   && ad.geo.Distance(geo) <= 15000 //15km

                   select new SearchModel.Result
                   {
                       businessId = b.businessId,
                       businessName = b.name,
                       serviceName = s.name,
                       price = se.price, //potentially incorrect
                       time = av.startAt //potentially incorrect
                   }).ToList();

    return results;
}

这是数据库结构: enter image description here

1 个答案:

答案 0 :(得分:0)

我发了一个&#34;答案&#34;关于G +的问题,但我想我会把它贴在这里以获得更多的覆盖范围和更好的格式:

如果我理解正确,您需要的主要信息是&#34; 可用性&#34;表。 您可以将其用作起点,并通过进一步的连接来优化查询。 起始(基本)SQL查询类似于:

SELECT Availabity.EmployeeId FROM Availability
WHERE day = :Query.day AND (EndAt - StartAt) >= :Query.ServiceDuration

结果将是在该特定时间具有可用性的所有员工的列表。 然后,您可以优化结果以将其缩小到提供给定服务的员工等。