2015-09-15 4 views
0

Как написать предложение where для этой проблемы?Сложный linq с запросом Entity Framework

Я хочу получить список предприятий, в которых соответствующие сотрудники имеют время, чтобы сделать конкретную услугу в этот день.

Примеры: Кто-то ищет предприятия, предлагающие сервис x в четверг в 15:00. Он должен проверить доступность каждого сотрудника, бронирование и время, необходимое для выполнения услуги (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

Итак, что вы пробовали? – DotNetHitMan

ответ

0

я опубликовал «ответ» на свой вопрос на G +, но я думал, я бы вставить он здесь для большего охвата и лучшего форматирования:

Если вы правильно поняли, основная информация, которая вам нужна, находится в таблице «« Наличие ». Вы можете использовать это как отправную точку и уточнить свой запрос с дальнейшими объединениями. Исходный (базовый) SQL-запрос будет что-то вроде:

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

Результатом будет список всех сотрудников с наличием в тот конкретный момент времени. Затем вы можете уточнить результаты, чтобы сузить его, чтобы сотрудники, предлагающие данную услугу, и т. Д.

Смежные вопросы