Возникла исключительная ситуация при использовании запроса Linq с Entity Framework - PullRequest
3 голосов
/ 02 ноября 2010

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

Вот что я пытаюсь сделать.Пользователь выбирает состояние, затем ComboBox загружает города в этом состоянии, затем, когда пользователь выбирает город, ListBox загружает все проекты из этого города.

При запуске метода, который должен загружать проекты в ComboBox,Я получаю эту ошибку:

Исключение было сгенерировано целью вызова.Внутреннее исключение: "{" Указанное приведение недопустимо. "}" Допустимо. "}"

Этот метод вызывает исключение:

private void LoadProjectsToListBox(long idCity)
{
    ProjectRepository projectRepo = new ProjectRepository();    

    //This line causes the error.
    var projects = projectRepo.FindAllProjects().Where(c => c.IDCity == 1).ToList();
}

ВLinq запрос, вы увидите, что я сравниваю с жестко закодированным числом.1, это действительный идентификатор города, в котором есть проекты, поэтому он должен работать.Исключение возникает только тогда, когда я даю в запрос Linq идентификатор города с проектами.Таким образом, кажется, что ошибка возникает, когда запрос возвращает результаты.

Вот операторы SQL, которые я использовал для генерации таблиц Project и City:

create table City
(
    ID integer primary key autoincrement,
    Name string,
    IDState integer references State(ID)
);

create table Project
(
    ID integer primary key autoincrement,
    Name string,
    StartDate text,
    IDManager integer references Manager(ID),
    IDCity integer references City(ID),
    IDDepartment integer references Department(ID),
    ContactNumber string,
    Description string
);

Мне кажется странным, чтоиспользуя точно такой же шаблон и код доступа , чтобы показать список отделов (просто еще одну таблицу в моей базе данных), все работает как ожидалось.Например, вот как я загружаю Отделы прямо сейчас только для тестирования:

private void LoadProjectsToListBox(long idCity)
{
    ProjectRepository projectRepo = new ProjectRepository();
    DepartmentRepository departmentRepo = new DepartmentRepository();

    //Doesn't work - raises exception.
    var projects = projectRepo.FindAllProjects().Where(c => c.IDCity == 1).ToList();

    //Works exactly as expected.
    var deps = departmentRepo.FindAllDepartments().Where(c => c.IDParentDepartment == 7).ToList();

    lstProjects.Items.Clear();
    foreach (var item in deps)
    {
        lstProjects.Items.Add(item.Name);
    }
}

Редактировать:

Методы FindAllDepartments (), FindAllCities (), FindAllProjects ()по сути то же самое.

DocumentsDBEntities db = new DocumentsDBEntities();

public IQueryable<Project> FindAllProjects()
{
    return db.Projects;
}

public IQueryable<City> FindAllCities()
{
    return db.Cities;
}

public IQueryable<Department> FindAllDepartments()
{
    return db.Departments;
}

Как уже упоминалось ранее, отдел извлечения работает;Извлечение проекта вызывает исключение.

Редактировать 3:

Я исправил это!Проблема заключалась в использовании типа данных «Текст» в таблице «Проект».Если я изменил тип данных из этого столбца с «Текст» на «Строка», он будет работать безупречно.Кто-нибудь может сказать мне, почему?

Ответы [ 3 ]

1 голос
/ 02 ноября 2010

У меня была точно такая же проблема на прошлой неделе!В моем случае проблема заключалась в том, что некоторые из таблиц, которые я перетянул в файл .dbml, имели другое соединение с базой данных (тест по сравнению с производством), и хотя таблицы (концептуально) были одинаковыми, невозможно было привести таблицувведите 'db1.table1' в 'db2.table1'.Я не знаю, является ли это корнем вашей проблемы или нет, но я надеюсь, что это поможет каким-то образом.Я решил, что все мои таблицы исходят из одного и того же соединения с базой данных.

1 голос
/ 30 июня 2011

Согласно тому, что я вижу здесь , тип данных Text не позволяет сравнивать с == (или OrderBy, если на то пошло).Если я не понял документы.

0 голосов
/ 02 ноября 2010

Вы чаще всего начинаете свой запрос с города (сверху вниз):

var projects = projectRepo.FindAllCities()
    .Where(c => c.ID == 1)
    .Select(p => p.Projects)
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...