无法将类型为“System.Int32”的对象强制转换为在LINQ查询中键入“System.String”

时间:2015-03-24 06:04:07

标签: c# linq visual-studio-2010 deferred-execution

您好我正在尝试从我的数据库中删除用户。我不知道为什么我收到此错误,因为我的变量(employeeName,departmentName)都不是int类型。

调试器使用“无法将类型为System.Int32的对象”转换为'System.String'来停止此代码块。“错误。

//Note: employeeName type is navchar
        var empQuery =
            from dep in db.Department
            join emp in db.EmployeeDetails
            on dep.departmentId equals emp.departmentId
            where dep.departmentName == reqDep
            && emp.employeeName == reqUser
            select emp;

        //Debugger keeps pointing to the foreach with the error
        foreach (var element in empQuery)
        {
            Console.WriteLine("user: " + element + " has been deleted");
            db.EmployeeDetails.DeleteOnSubmit(element);
        }
        // Freeze the console window.
        Console.ReadLine();

如果有帮助,我已在下面提供了整个代码。

namespace runLinqSql
{
// Table<T> abstracts database details per table/data type. 
[Database]
public class FireEvacuation : DataContext
{
    public Table<Employee> EmployeeDetails;
    public Table<EmpDepartment> Department;

    public FireEvacuation(string connection) : base(connection) { }
}
  class Program
{
    static void Main(string[] args)
    {
        // Use a connection string.
        FireEvacuation db = new FireEvacuation
            (@"C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\runSqlLinq\FireEvacuation.mdf");


        ////specify department to be removed
        string reqDep = "KOM";
        // Attach the log to show generated SQL.
        db.Log = Console.Out;

        ////specify user to be removed
        string reqUser = "Jason";


        //Note: employeeName type is navchar
        var empQuery =
            from dep in db.Department
            join emp in db.EmployeeDetails
            on dep.departmentId equals emp.departmentId
            where dep.departmentName == reqDep
            && emp.employeeName == reqUser
            select emp;

        //Debugger keeps pointing to the foreach with the error
        foreach (var element in empQuery)
        {
            Console.WriteLine("user: " + element + " has been deleted");
            db.EmployeeDetails.DeleteOnSubmit(element);
        }
        // Freeze the console window.
        Console.ReadLine();

        try
        {
            db.SubmitChanges();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            // Provide for exceptions.
        }

3 个答案:

答案 0 :(得分:1)

我觉得错误与以下某行有关:

on dep.departmentId equals emp.departmentId
where dep.departmentName == reqDep
&& emp.employeeName == reqUser

(在循环中抛出异常的原因是表达式在此之前不会运行,这是第一次需要它)。

您在此处成对比较值。现在,如果对中的某个值的类型为string,而另一个值的类型为int,则会导致该错误。

要解决此问题,请仔细检查您要比较的每个对是否真正有效(即dep.departmentIdemp.departmentId确实是您想要比较的对象),并且类型是相同的。

如果类型相同,但仍可以预期它们返回等效值(例如:dep.departmentId可以是int值123,而emp.departmentId是字符串“123”),您可以将它们作为字符串进行比较:

on dep.departmentId.ToString() equals emp.departmentId.ToString()

答案 1 :(得分:1)

找到这样的问题的一种方法: (我称之为硬核调试)

缩小代码

  • 从另一个元素中删除一个元素,形成导致问题的代码。
  • 每次修改后运行代码。

通过这种方式,您会发现哪个元素会导致问题。

在您的情况下,您可以用非常简单的查询替换查询,然后添加连接等等。

答案 2 :(得分:0)

我发现这里的问题不是我的代码中的实际LINQ查询,而是我在dbml文件中查询的表的问题。问题是该表的主键,即它没有!一旦我设置了表的主键,然后将其再次添加到我的dbml文件中,我的查询就可以了。