无法将类型 'System.Int32' 的对象转换为 LINQ 查询中的类型 'System.String'

Unable to cast object of type 'System.Int32' to type 'System.String' in LINQ query

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

调试器一直停在这个代码块上,出现 "Unable to cast object of type 'System.Int32' to type '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.
        }

在我看来,该错误与以下行之一有关:

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

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

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

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

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

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

一种查找问题的方法如下: (我称之为硬核调试)

让你的代码更小

  • 从导致问题的代码片段中一个一个地删除一个元素。
  • 运行每次修改后的代码。

这样你就可以找出是哪个元素导致了问题。

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

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