Да, ваши уроки не сбалансированы, но у вас достаточно образов, чтобы вы справлялись с этим лучше. Как вы выбрали свой поезд / тестовый раздел? Результаты показывают, что там есть проблема рандомизации. Как бы они ни были выбраны, ваша модель изучает неправильные критерии классификации.
Это напоминает мне модель «собака / кошка», которая научилась различать фон, на котором люди фотографируют своих питомцев.
Сначала попробуйте вращать или перетасовывать тренировочные и тестовые наборы. Можете ли вы использовать перекрестную проверку в этом приложении? Это само по себе может решить вашу проблему.
Если это не удастся, можете ли вы изменить модель - возможно, включить выпадающий слой? Это помогло бы выучить неверные гипотезы.
Entity Framework не поддерживает все запросы. Это становится очевидным, если вы подумаете о чем-то вроде следующего
dataContext.Persons.Where(person => MyMethod(person));
с MyMethod ()
, возвращающим логическое значение. Метод может делать все, и вы не можете все перевести на SQL. Решение состоит в том, чтобы поместить все объекты в локальную память с помощью ToList ()
, а затем использовать LINQ to Object.
dataContext.Persons.ToList().Where(person => MyMethod(person));
Это зависит от вашего фактического запроса, если его можно переписать, чтобы преобразовать в SQL Entity Framework или если вам нужно выполнить запрос в локальной памяти с помощью LINQ to Object.
Исключение, о котором вы упомянули, звучит так, как будто вы пытаетесь что-то вроде следующего.
Company company = datacontext.Companies.Where(company.Name == "ACME").Single();
dataContext.Employees.Where(employee => employee.Company == company);
LINQ to Entity не поддерживает выражения, содержащие сущности, следовательно, сравнение объектов Компании
недействительно. В этом случае вы можете переписать его следующим образом.
dataContext.Employees.Where(employee => employee.Company.Id == company.Id);
При этом сравниваются только идентификаторы - примитивный тип, такой как целое число или GUID, - и он может быть преобразован в SQL.
Пример для поиска по слову (см. Также комментарии)
IQueryable<People> result = entities.People;
foreach (String item in searchList)
{
// This copy is important in order not to modify the closure.
String itemCopy = item;
result = result.Where(p =>
p.FirstName.ToUpper().Contains(itemCopy) ||
p.LastName.ToUpper().Contains(itemCopy) ||
p.Phone.ToUpper().Contains(itemCopy));
}
Это построит запрос слово за словом. Отметил, что Entity Framework распознает ToUpper ()
, ToLower ()
и Contains ()
(и некоторые другие), поэтому я был очень строгим, когда сказал что Entity Framework не распознает вызовы методов. Да, но не многие, и не ToUpperInvariant ()
и ToLowerInvariant ()
. Далее этот запрос преобразуется в вызовы функции CHARINDEX ()
с использованием сортировки столбца, поэтому поиск может быть нечувствительным к регистру без явного ToUpper ()
или ToLower ()
звонки.