2010-11-01 2 views
3

Я удалил из этого вопроса значительное количество текста, потому что я считаю, что нужно быть более кратким. - SergИсключение, возникающее при использовании запроса Linq с платформой Entity Framework

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

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

Exception has been thrown by the target of an invocation. Inner Exception is: "{"Specified cast is not valid."}"valid."}"

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

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, которые я использовал для создания проекта и городов столы:

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); 
    } 
} 

Edit:

В 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; 
} 

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

Edit 3:

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

+0

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

+0

В той части, которая работает, вы добавляете только строку (project.Name)? В том, что не работает (если я правильно понял вопрос), кажется, что источник данных подключен к списку объектов, и ошибка звучит так, как будто он не смог найти подходящие значения для указанных объектов. Я считаю, что наблюдаемое поведение может быть красно-селедочным. Счастливое кодирование. – 2010-11-02 00:25:03

+0

Если я просто использую эту строку, у меня все еще есть ошибка: var x = projectRepo.FindAllProjects(). Где (l => l.IDCity == idCity) .ToList(); – 2010-11-02 00:27:11

ответ

0

Вы больше всего начать свой запрос с городом (до вниз):

var projects = projectRepo.FindAllCities() 
    .Where(c => c.ID == 1) 
    .Select(p => p.Projects) 
    .ToList(); 
0

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

1

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

Смежные вопросы