Платформа объекта - “Весь” метод

Да, ваши уроки не сбалансированы, но у вас достаточно образов, чтобы вы справлялись с этим лучше. Как вы выбрали свой поезд / тестовый раздел? Результаты показывают, что там есть проблема рандомизации. Как бы они ни были выбраны, ваша модель изучает неправильные критерии классификации.

Это напоминает мне модель «собака / кошка», которая научилась различать фон, на котором люди фотографируют своих питомцев.

Сначала попробуйте вращать или перетасовывать тренировочные и тестовые наборы. Можете ли вы использовать перекрестную проверку в этом приложении? Это само по себе может решить вашу проблему.

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

8
задан Community 23 May 2017 в 11:46
поделиться

1 ответ

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 () звонки.

14
ответ дан 5 December 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: