C# 查询中的用户代码未处理System.Data.Entity.Core.EntityCommandExecutionException

C# 查询中的用户代码未处理System.Data.Entity.Core.EntityCommandExecutionException,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我的DataController.cs中有一个方法: public JsonResult MoveInLogin(LoginData d) { using (MoveInDBEntities dm = new MoveInDBEntities()) { var user = dm.MoveIns.Where(a => a.CID.Equals(d.CID) && a.Email.Equals(d.Email)).FirstOrDefault(

我的
DataController.cs中有一个方法:

public JsonResult MoveInLogin(LoginData d)
{
    using (MoveInDBEntities dm = new MoveInDBEntities())
    {
        var user = dm.MoveIns.Where(a => a.CID.Equals(d.CID) && a.Email.Equals(d.Email)).FirstOrDefault();
        return new JsonResult { Data = user, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }
}
在声明用户的第4行,触发此异常:

类型的例外 中出现“System.Data.Entity.Core.EntityCommandExecutionException” EntityFramework.SqlServer.dll,但未在用户代码中处理

当我进一步查看时,我注意到异常详细信息如下:

System.Data.SqlClient.SqlException:数据类型text和varchar 在“等于”运算符中不兼容

在SQL数据库中,我的列名CID的类型为
varchar(10)
,电子邮件的类型为
text

如何格式化查询以消除此异常

电子邮件在SQL数据库中为文本类型

在语句中,您将电子邮件属性作为参数与文本列中包含的电子邮件属性进行比较。电子邮件属性可能被参数化为
varchar
类型,sql语句失败,因为生成的语句可能是
@Email=Email
,其中
@Email
类型为
varchar
,Email类型为
text

类型
text
也已过时(),Microsoft希望现在每个人都使用
varchar(max)
nvarchar(max)
作为ntext。将数据库中的sql类型转换为
varchar(max)
将解决这个问题,这是最好的方法

您应该查看类型映射,因为您可能能够指定电子邮件实际上是类型
Text
,但即使这样也可能会失败,因为我不相信可以比较或搜索sql类型
Text
(可能我错了)


重新创建错误

create table #MoveIns (
CID varchar(10) not null,
Email text not null)

insert into #MoveIns (CID, Email) values('1','email 1')
, ('2','email 2')

declare @cid varchar(10) = '1', @email varchar(2000) ='email 1'

/*Next line has error: The data types varchar and text are incompatible in the equal to operator.*/
select * from #MoveIns where @cid = CID AND @email = Email

drop table #MoveIns
修正错误

create table #MoveIns (
CID varchar(10) not null,
Email text not null)

insert into #MoveIns (CID, Email) values('1','email 1')
, ('2','email 2')

/*This statement is what you want*/
alter table #MoveIns alter column Email VARCHAR(MAX) NOT NULL
GO

/*Test*/
declare @cid varchar(10) = '1', @email varchar(2000) ='email 1'

/*The data types varchar and text are incompatible in the equal to operator.*/
select * from #MoveIns where @cid = CID AND @email = Email

如果仍有错误,请确保没有其他类型为
text
的列。您可以使用
sp_columns
或使用Management Studio中的设计器查询数据库表

电子邮件在SQL数据库中为文本类型

在语句中,您将电子邮件属性作为参数与文本列中包含的电子邮件属性进行比较。电子邮件属性可能被参数化为
varchar
类型,sql语句失败,因为生成的语句可能是
@Email=Email
,其中
@Email
类型为
varchar
,Email类型为
text

类型
text
也已过时(),Microsoft希望现在每个人都使用
varchar(max)
nvarchar(max)
作为ntext。将数据库中的sql类型转换为
varchar(max)
将解决这个问题,这是最好的方法

您应该查看类型映射,因为您可能能够指定电子邮件实际上是类型
Text
,但即使这样也可能会失败,因为我不相信可以比较或搜索sql类型
Text
(可能我错了)


重新创建错误

create table #MoveIns (
CID varchar(10) not null,
Email text not null)

insert into #MoveIns (CID, Email) values('1','email 1')
, ('2','email 2')

declare @cid varchar(10) = '1', @email varchar(2000) ='email 1'

/*Next line has error: The data types varchar and text are incompatible in the equal to operator.*/
select * from #MoveIns where @cid = CID AND @email = Email

drop table #MoveIns
修正错误

create table #MoveIns (
CID varchar(10) not null,
Email text not null)

insert into #MoveIns (CID, Email) values('1','email 1')
, ('2','email 2')

/*This statement is what you want*/
alter table #MoveIns alter column Email VARCHAR(MAX) NOT NULL
GO

/*Test*/
declare @cid varchar(10) = '1', @email varchar(2000) ='email 1'

/*The data types varchar and text are incompatible in the equal to operator.*/
select * from #MoveIns where @cid = CID AND @email = Email


如果仍有错误,请确保没有其他类型为
text
的列。您可以使用
sp_columns
查询数据库表,也可以使用Management Studio中的设计器。

我将其更改为键入
varchar(max)
,但由于使用了Equals方法,代码仍然无法工作。您能告诉我如何更改查询以使其工作吗?我将其更改为type
varchar(max)
,但由于使用了Equals方法,代码仍然无法工作。你能告诉我如何改变我的查询,使它工作吗?