Entity Framework 6 执行Linq to Entities异常"p__linq__1 : String truncation: max=0, len=2, value='测试'"

场景再现

我需要查询公司名称包含给定字符串的公司,于是我写了下面的测试小例子:

var condition = "测试";
var query = from b in db.Companies
            where (condition == null || condition == "") ? true : b.Name.Contains(condition)
            orderby b.CompID
            select new
            {
                CompID = b.CompID,
                Name = b.Name
            };

Console.WriteLine("All companies in the database:");
foreach (var item in query)
{
    Console.WriteLine("ID:" + item.CompID + "\tName:" + item.Name);
}

没想到运行的时候出现如下异常:

异常信息:“p__linq__1 : String truncation: max=0, len=2, value='测试'”。

异常截图

在EF的映射关系中,我明明将Name一项设了最大长度是64:

public class CompanyMap : EntityTypeConfiguration<Company>
    {
        public CompanyMap()
        {
            ToTable("Companies");
            HasKey(p => p.PKCompany);
            Property(p => p.Name).IsRequired().HasMaxLength(64).HasColumnName("Company");
            Property(p => p.IsChecked).IsRequired();
        }
    }

那为什么查询的时候会说最大长度是0,而传入的参数长度是2,超过了这个0呢?

问题方案

我尝试把where部分的三元表达式前面去掉,直接使用contains判断是没问题的,于是我怀疑是三元表达式那个条件出问题了,而提示字符串最大长度是0,我想到可能是判断空字符那个条件有问题,所以我提前处理了一下,把程序改成如下,然后绕过了这个异常:

var condition = "测试";

//...
condition = (condition == null || condition == "") ? null : condition;
var query = from b in db.Companies
            where condition == null ? true : b.Name.Contains(condition)
            orderby b.CompID
            select new
            {
                CompID = b.CompID,
                Name = b.Name
            };

如果条件为null或者为空字符"",那么都改成空null,这么改完以后程序就工作了。

我查找了不少资料,介绍的方案都不是太有用,这里记录一下如果有遇到这个异常的同学可以试一下!

这里我也没用LinqPad去测试翻译的结果,这个难道是EF的一个bug?

 

posted @ 2015-09-18 12:26  沙场秋点兵  阅读(1147)  评论(7编辑  收藏  举报