Как мне конвертировать SQL Query в Lambda? - PullRequest
0 голосов
/ 11 июля 2019

У меня следующий запрос SQL, который возвращает нужные мне результаты:

SELECT 
       STAFF_ID
FROM [dbo].[StaffTable]
WHERE STAFF_ID NOT IN (SELECT STAFF_ID 
                                     FROM [dbo].[StaffingTable]
                                     WHERE [DATE] = @DATE
                                     AND MODEL_ID = @Model)

У меня есть следующий метод контроллера, чтобы попытаться вернуть правильные результаты:

public JsonResult GetStaffResults(DateTime date, string modelId)
        {
            Guid modelGuid = Guid.Parse(modelId);
            var settings = new JsonSerializerSettings();

            var staff = context.StaffTable.Select(c => new
            {
                Id = c.StaffId,
                Name = c.StaffName
            });

            var staffing = context.StaffingTable.Select(c => new
            {
                modelId = c.ModelId,
                manufacturerId = c.ManufacturerId,
                staffId = c.StaffId,
                date = c.Date,
                recordId = c.RecordId
            });

            var staffResults = staff.Where(p => staffing.Select(o => o.modelId).First() == modelGuid && !staffing.Select(o => o.date).Contains(date));

            return Json(shiftResults, settings);
        }

Однако я борюсь с лямбда-выражением, оно не возвращает результатов, поэтому я кое-что пропустил.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Вы можете попробовать что-то вроде этого:

 public JsonResult GetStaffResults(DateTime date, string modelId)
        {
            Guid modelGuid = Guid.Parse(modelId);
            var settings = new JsonSerializerSettings();

            var staffQuery = context.StaffTable
                .Where(s => !context
                    .StaffingTable
                    .Any(st => st.StaffId = s.StaffId && st.modelId == modelGuid && st.date == date))
                .Select(c => new
                {
                    Id = c.StaffId,
                    Name = c.StaffName
                });

            return Json(staffQuery.ToList(), settings);
        }
0 голосов
/ 11 июля 2019

Вы выполняете отдельный запрос с Select, который имеет проблему с производительностью, так как запросы будут возвращать IEnumerable<T> объектов. Если вы хотите иметь отдельные запросы, попробуйте получить результаты запроса как IQueryable<T>, который будет создавать запросы и загружать данные в конце.

Например:

var query =    
    from st in context.StaffTable  
    where !(from stff in context.StaffingTable  
            select stff.CustomerID)
            where stff.MODEL_ID = ModelIdVariable AND stff.DATE = DATEVariable
           .Contains(st.CustomerID)    
    select st;

Объявите и заполните переменные ModelIdVariable и DATEVariable перед запросом.

Тогда вы можете сделать query.ToList<T>() там, где вам нужно загрузить данные.

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