使用Entity Framework的Linq查询时出现异常

3

由于我认为这个问题需要更简洁,所以我删除了大量文本。-Serg

这是我想做的事情。用户选择一个州,然后ComboBox会加载该州的城市,然后当用户选择一个城市时,ListBox会加载该城市的所有项目。

运行应该将项目加载到ComboBox的方法时,我收到以下错误:

已引发异常 调用目标的内部异常是: "{"指定的强制转换无效。"}"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 是具有项目的城市的有效 ID,因此应该可以工作。只有当我给 Linq 查询一个具有项目的城市 ID 时才会引发异常。因此,似乎是在查询返回结果时引发了错误。
这是我用来生成 Project 和 City 表的 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);
    }
}

编辑:

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:

我解决了!问题出在在项目表中使用了“文本”数据类型。如果我将该列的数据类型从“文本”更改为“字符串”,它就可以完美地工作了。有人能告诉我为什么吗?


谢谢提供堆栈跟踪。您提到了内部异常,能否提供该异常的堆栈跟踪? - Kirk Woll
在正常工作的部分,你只是添加一个字符串(project.Name)?在那个不起作用的部分(如果我能正确理解问题),数据源似乎被连接到对象列表,并且错误听起来像是无法检索适当值的对象。我认为观察到的行为可能是一个误导。祝编码愉快。 - user166390
如果我只使用这一行,我仍然会有错误:var x = projectRepo.FindAllProjects().Where(l => l.IDCity == idCity).ToList(); - delete
你在数据库中有做任何更改吗?idCity 的传递值是什么? - Homam
就像我说的那样,即使我忽略传递的值,只使用手动输入的数字,当该数字表示具有项目的城市的ID时,错误也会出现。如果我给它一个没有项目的城市的数字,就不会出现错误。 - delete
1
FindAllProjects() 方法在哪里?这很可能是无效转换异常发生的地方。 - Ian Mercer
3个回答

1

根据我在这里看到的,Text数据类型不允许使用==(或OrderBy)进行比较。除非我误解了文档。


1

上周我也遇到过完全相同的问题!我的情况是,我将一些表格移动到了.dbml文件中,但它们与不同的数据库连接(测试与生产)相关联。尽管这些表格在概念上是相同的,但是将类型为'db1.table1'的表格转换为'db2.table1'是不可能的。我不知道这是否是您问题的根源,但我希望这能以某种方式帮助您。确保所有的表格都来自于完全相同的数据库连接是解决我的问题的方法。


0

你的查询必须以城市名称(从上到下)开头:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接