场景再现

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

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().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?

Entity Framework 6 执行Linq to Entities异常"p__linq__1 : String truncation: max=0, len=2, value='测试'"的更多相关文章

  1. Data Developer Center > Learn > Entity Framework > Get Started > Loading Related Entities

    Data Developer Center > Learn > Entity Framework > Get Started > Loading Related Entitie ...

  2. [翻译] - <Entity Framework> - 直接执行数据库命令

    原文:[翻译] - <Entity Framework> - 直接执行数据库命令 纯属学习上的记录, 非专业翻译, 如有错误欢迎指正! 原文地址: http://msdn.microsof ...

  3. 关于MySql entity framework 6 执行like查询问题解决方案

    原文:关于MySql entity framework 6 执行like查询问题解决方案 本人不善于言辞,直接开门见山 环境:EF6.0.0.0+MySQL Server5.6+MySqlConnec ...

  4. 在Entity Framework 中执行T-sql语句

    从Entity Framework  4开始在ObjectContext对象上提供了2个方法可以直接执行SQL语句:ExecuteStoreQuery<T> 和 ExecuteStoreC ...

  5. Entity Framework Core 执行SQL语句和存储过程

    无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...

  6. [转]在Entity Framework中使用LINQ语句分页

    本文转自:http://diaosbook.com/Post/2012/9/21/linq-paging-in-entity-framework 我们知道,内存分页效率很低.并且,如果是WebForm ...

  7. Entity Framework——记录执行的命令信息

    有两种方法可以记录执行的SQl语句: 使用DbContext.Database.Log属性 实现IDbCommandInterceptor接口 一 使用DbContext.Database.Log属性 ...

  8. Entity Framework中执行Sql语句

           如果想在EF框架中执行Sql语句,其实很简单,EF里面已经提供了相关的方法(此处使用的EF为EF4.1版本).        EF中提供了两个方法,一个是执行查询的Sql语句SqlQue ...

  9. Entity Framework EF6使用 MySql创建数据库异常解决办法

    EF6使用MySQL数据库时,第一次创建数据库出现“Specified key was too long; max key length is 767 bytes”错误,解决办法请见以下连接. htt ...

随机推荐

  1. Spring-Context之七:使用p-namesapce和c-namespace简化bean的定义

    在Spring中定义bean的方式多种多样,即使使用xml的方式来配置也能派生出很多不同的方式. 比如如下的bean定义: 1 2 3 4 5 6 7 8 9 10 11 12 <beans x ...

  2. AT&T Assembly on Linux

    je if equal then jmp jg if the second gt the first, then jmp jge if the second ge the first, then jm ...

  3. 元素设置为display:none,其绑定的事件仍存在

    元素设置为display:none,虽然该元素从页面中消失了,其绑定的事件仍存在. <body> <button class="button1">chang ...

  4. 我心中的核心组件~MSMQ与Redis队列

    回到目录 这个文章其实是我心中的核心组件的第七回,确实在时间上有些滞后了,但内容并不滞后!本文MSMQ只是个引题,我确实不太想说它,它是微软自己集成的一套消息队列,寄宿在Window服务里,稳定性十在 ...

  5. Atitit 图像金字塔原理与概率 attilax的理解总结qb23

    Atitit 图像金字塔原理与概率 attilax的理解总结qb23 1.1. 高斯金字塔  (  Gaussianpyramid): 拉普拉斯金字塔 (Laplacianpyramid):1 1.2 ...

  6. fir.im Weekly - 新开发时代,需要什么样的技术分享

    "2016年,当我们迎来了如Xcode 8.Swift 3.SiriKit.Android N.Android Instant Apps.React Native等诸多移动开发技术.开发工具 ...

  7. SQL Server排序函数row_number和rank的区别

    SQL Server排序函数row_number和rank的区别 直接看测试结果 declare @table table(name varchar(100),amount int, memo var ...

  8. 学习Data Science/Deep Learning的一些材料

    原文发布于我的微信公众号: GeekArtT. 从CFA到如今的Data Science/Deep Learning的学习已经有一年的时间了.期间经历了自我的兴趣.擅长事务的探索和试验,有放弃了的项目 ...

  9. Python流程控制语句

    人们常说人生就是一个不断做选择题的过程:有的人没得选,只有一条路能走:有的人好一点,可以二选一:有些能力好或者家境好的人,可以有更多的选择:还有一些人在人生的迷茫期会在原地打转,找不到方向.对于相信有 ...

  10. Android入门(二十)HttpURLConnection与HttpClient

    原文链接:http://www.orlion.ga/679/ 在 Android上发送 HTTP请求的方式一般有两种,HttpURLConnection和 HttpClient. 一.HttpURLC ...