使用like时搜索出错

时间:2016-01-08 17:07:59

标签: c# entity-framework firebird

我在Firebird数据库中有一个表

CREATE TABLE CIDADE (
CID_CD              SMALLINT NOT NULL,
CID_DS              CHAR(20) NOT NULL,
CID_UF              CHAR(2) NOT NULL,
CID_DISTANCIA_SEDE  SMALLINT NOT NULL,
CID_CD_ALTERNATIVO  INTEGER NOT NULL,
CID_DT_LK           DATE NOT NULL);

我正在使用带有表列的LINQ进行查询,我在CHAR类型列中收到错误:

  

算术异常,数字溢出或字符串截断字符串右截断

识别问题,我意识到字符串字段的大小超出了字段的限制。我不明白这一点,因为我在这些字段上映射了正确的长度限制。

按照我的代码:

public IQueryable<Cidade> Pesquisar(Cidade cidade)
{
    string uf = cidade.UF; // "SP" for example
    var query = pctxContexto.Cidade.Where(c=> c.UF.Contains(uf));
    return query;
}

映射:

// Table Mapping
ToTable("CIDADE");

//Chave primária
HasKey(t => new { t.Codigo });

//Propriedades
Property(t => t.Codigo).HasColumnName("CID_CD");

Property(t => t.Descricao)
    .IsRequired()
    .HasMaxLength(20)
    .HasColumnType("Char")
    .HasColumnName("CID_DS");

Property(t => t.UF)
    .IsRequired()
    .HasMaxLength(2)
    .HasColumnType("Char")
    .HasColumnName("CID_UF");

Property(t => t.DistanciaSede)
    .IsRequired()
    .HasColumnType("Smallint")
    .HasColumnName("CID_DISTANCIA_SEDE");

Property(t => t.Codigo_Alternativo)
    .IsRequired()
    .HasColumnType("Int")
    .HasColumnName("CID_CD_ALTERNATIVO");

我该如何解决这个问题?它为什么会发生?

2 个答案:

答案 0 :(得分:3)

如果我没弄错的话,.Where(c=> c.UF.Contains(uf)会被翻译为WHERE c.UF LIKE ?,参数的值为"%SP%",即4个字符。

问题在于Firebird描述并且只接受长度最大为字段声明长度的参数,即2个字符。因此,使用长度为4的值将失败,并出现字符串截断错误。对于可接受的作业,但为了进行比较(尤其是对于LIKESIMILAR TO),这非常令人讨厌。

正常的解决方法是将参数转换为更长的类型,但我不确定在使用实体框架时是否有办法执行此操作。唯一的其他解决方法是定义比数据严格必需的列更长的列。

相关的Firebird改进门票是:

答案 1 :(得分:0)

这很可能是与编码有关的问题。请尝试以下映射:

Property(t => t.UF)
    .IsRequired()
    .IsUnicode(false)            // <--- 
    .HasMaxLength(2)
    .HasColumnType("Varchar")
    .HasColumnName("CID_UF");

另一个选项(位于this answer中)是使用"AnsiString"自定义类型:

Property(t => t.UF)
    .IsRequired()
    .CustomType("AnsiString")    // <--- 
    .HasMaxLength(2)
    .HasColumnType("Varchar")
    .HasColumnName("CID_UF");