您好我正在尝试从我的数据库中删除用户。我不知道为什么我收到此错误,因为我的变量(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.
}
答案 0 :(得分:1)
我觉得错误与以下某行有关:
on dep.departmentId equals emp.departmentId
where dep.departmentName == reqDep
&& emp.employeeName == reqUser
(在循环中抛出异常的原因是表达式在此之前不会运行,这是第一次需要它)。
您在此处成对比较值。现在,如果对中的某个值的类型为string
,而另一个值的类型为int
,则会导致该错误。
要解决此问题,请仔细检查您要比较的每个对是否真正有效(即dep.departmentId
和emp.departmentId
确实是您想要比较的对象),并且类型是相同的。
如果类型不相同,但仍可以预期它们返回等效值(例如:dep.departmentId
可以是int值123,而emp.departmentId
是字符串“123”),您可以将它们作为字符串进行比较:
on dep.departmentId.ToString() equals emp.departmentId.ToString()
答案 1 :(得分:1)
找到这样的问题的一种方法: (我称之为硬核调试)
缩小代码
通过这种方式,您会发现哪个元素会导致问题。
在您的情况下,您可以用非常简单的查询替换查询,然后添加连接等等。
答案 2 :(得分:0)
我发现这里的问题不是我的代码中的实际LINQ查询,而是我在dbml文件中查询的表的问题。问题是该表的主键,即它没有!一旦我设置了表的主键,然后将其再次添加到我的dbml文件中,我的查询就可以了。