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?