Фильтрация запроса LINQ по DateTime, вызывающая ошибку System.NotSupportedException - PullRequest
0 голосов
/ 21 марта 2020

У меня есть таблица базы данных, содержащая список опросов средней школы. У меня есть контроллер, который отображает список записей в таблице БД. Я пытаюсь разрешить пользователю выполнять поиск определенных c записей опроса на дату "dd-MM-гггг".

Я пробовал следующее, хотя возвращаемое представление View (surveyys.ToPagedList (pagerNumber, pageSize) )) выдает следующую ошибку при поиске даты:

System.NotSupportedException: «LINQ to Entities не распознает метод метода System.String ToString (System.String)», и это метод не может быть преобразован в выражение хранилища. '

Мой контроллер индексов:

// GET: SecondarySchoolSurvey
        public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
        {
            ViewBag.CurrentSort = sortOrder;
            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";

            //paging
            if (searchString != null)
            {
                page = 1;
            }
            else
            {
                searchString = currentFilter;
            }

            ViewBag.CurrentFilter = searchString;

            var surveys = from s in db.SecondarySchoolSurveys
                           select s;

            if (!String.IsNullOrEmpty(searchString))
            {
                surveys = db.SecondarySchoolSurveys.Where(s => s.OfficialSchoolName.Contains(searchString) || s.RollNumber.Contains(searchString) || s.CampDate.Value.ToString("dd/MM/yyyy").Contains(searchString));
            }


            switch (sortOrder)
            {
                case "name_desc":
                    surveys = surveys.OrderByDescending(s => s.OfficialSchoolName);
                    break;
                default:
                    surveys = surveys.OrderBy(s => s.OfficialSchoolName);
                    break;
            }



            int pageSize = 10;
            int pageNumber = (page ?? 1);
            return View(surveys.ToPagedList(pageNumber, pageSize));
        }

Возможно, я мог бы использовать класс SqlFunctions, то есть SqlFunctions.StringConvert, но как мне тогда преобразовать DateTime в правильный формат (dd-MM-гггг)?

Я также пытался преобразовать строку поиска в DateTime, хотя получал исключение Sys.FormatException: «Строка не была распознана как допустимый DateTime».

DateTime dt = DateTime.Parse("dd-MM-yyyy", CultureInfo.InvariantCulture);
            if (!String.IsNullOrEmpty(searchString))
            {
                surveys = db.SecondarySchoolSurveys.Where(s => s.OfficialSchoolName.Contains(searchString) || s.RollNumber.Contains(searchString) || s.CampDate == dt);
        }

1 Ответ

3 голосов
/ 21 марта 2020

Если я понимаю вопрос, который вы могли бы использовать DateTime.TryParse

Преобразует указанное строковое представление даты и времени в его эквивалент DateTime и возвращает значение, указывающее, является ли преобразование выполнено успешно.

// Read the documentation on TryParse
var isDate = DateTime.TryParse(searchString, out var searchDate);

// the assumption is if it's a date, 
// then it's not going to satisfy any other search requirements 
if (isDate)
{
    // note, I use .Date as it's likely you don't want to compare time as well
    surveys = db.SecondarySchoolSurveys
                .Where(s => s.CampDate.Date = searchDate.Date);
} 
else if (!String.IsNullOrEmpty(searchString))
{
    surveys = db.SecondarySchoolSurveys
                .Where(s => 
                   s.OfficialSchoolName.Contains(searchString) || 
                   s.RollNumber.Contains(searchString))
}

Примечание : существуют другие варианты, как это сделать, вы можете иметь все это в одном запросе, хотя я думаю, что это явно и просто для понимания

...