无法将类型 '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.departmentId
和 emp.departmentId
确实是您想要比较的对象),并且类型相同.
如果类型不相同,但仍然可以预期它们是return等效值(例如:dep.departmentId
可能是一个int值123,而 emp.departmentId
是字符串“123”),您可以将它们作为字符串进行比较:
on dep.departmentId.ToString() equals emp.departmentId.ToString()
一种查找问题的方法如下:
(我称之为硬核调试)
让你的代码更小
- 从导致问题的代码片段中一个一个地删除一个元素。
- 运行每次修改后的代码。
这样你就可以找出是哪个元素导致了问题。
在你的情况下,你可以用一个非常简单的查询替换查询,然后添加连接等等。
我发现这里的问题不是我代码中的实际 LINQ 查询,而是我在 dbml 文件中查询的 table 的问题。问题是 table 的主键,即它有 none!一旦我设置了 table 的主键,然后再次将它添加到我的 dbml 文件中,我的查询就成功了。
您好,我正在尝试从我的数据库中删除一个用户。我不确定为什么会收到此错误,因为 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.departmentId
和 emp.departmentId
确实是您想要比较的对象),并且类型相同.
如果类型不相同,但仍然可以预期它们是return等效值(例如:dep.departmentId
可能是一个int值123,而 emp.departmentId
是字符串“123”),您可以将它们作为字符串进行比较:
on dep.departmentId.ToString() equals emp.departmentId.ToString()
一种查找问题的方法如下: (我称之为硬核调试)
让你的代码更小
- 从导致问题的代码片段中一个一个地删除一个元素。
- 运行每次修改后的代码。
这样你就可以找出是哪个元素导致了问题。
在你的情况下,你可以用一个非常简单的查询替换查询,然后添加连接等等。
我发现这里的问题不是我代码中的实际 LINQ 查询,而是我在 dbml 文件中查询的 table 的问题。问题是 table 的主键,即它有 none!一旦我设置了 table 的主键,然后再次将它添加到我的 dbml 文件中,我的查询就成功了。