为了根据用户所选择的条件来动态构造linq查询,决定使用ExpressionTree来实现,因为在SIte表中的SiteNo是String类型的,所以界面上有个功能是用户填写SiteNo的范围,然后来查找,与是写如下语句
BinaryExpression siteNoExpression = Expression.AndAlso(
Expression.LessThanOrEqual(
Expression.Property(dimsite, propertyInfo),
Expression.Constant(txtStartSiteNo.Text, typeof(String))
),
Expression.GreaterThanOrEqual(
Expression.Property(dimsite, propertyInfo),
Expression.Constant(txtEndSiteNo.Text, typeof(String)))
);
与是杯具开始上演,发生异常如下:
没有为类型“System.String”和“System.String”定义二进制运算符 LessThanOrEqual。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.InvalidOperationException: 没有为类型“System.String”和“System.String”定义二进制运算符 LessThanOrEqual。
而在网上搜了下,原因是因为String并没有重载操作符>=和<=,所以大多都是使用CompareTo,但都没有使用Expression,而是直接使用查询表达式来实现的,如下:
var query = from item in context.Sites
where item.SiteNo.ComparentTo(txtStartNo.Text)>=0
那么Expression如何来写呢,众里寻它千百度的过程就省略了,直接贴结果:
ParameterExpression dimsite = Expression.Parameter(typeof(DimSite), "dimsite");
var propertyInfo = typeof(DimSite).GetProperty("SiteNo");
var methodInfo = typeof(String).GetMethod("CompareTo", new Type[] { typeof(String) });//因为CompareTo有重载,所以这里指定了下参数的类型,否则会报反射异常
BinaryExpression siteNoExpression =
Expression.GreaterThanOrEqual(
Expression.Call(
Expression.Property(dimsite, propertyInfo),
methodInfo,
Expression.Constant(txtStartSiteNo.Text, typeof(String))
),
Expression.Constant(0, typeof(Int32)) //比较String.CompareTo的返回结果和0,来实现>=的效果
);
var expressionTree = Expression.Lambda<Func<DimSite, Boolean>>(siteNoExpression, new ParameterExpression[] { dimsite });
IQueryable<DimSite> query = context.DimSites.Where(expressionTree);
AspNetPager1.RecordCount = query.Count();
最终的SQL语句如下:
SELECT COUNT(*) AS [value] FROM [Site] AS [t0] WHERE [t0].[SiteNo] >= @p0
不过用Expression来写,实在太复杂了,所以被网友踩了下,换成Lanbda表达式,如下:
Expression<Func<DimSite, Boolean>> siteNodeExpTree =
site =>
site.SiteNo.CompareTo(txtStartSiteNo.Text) >= 0 && site.SiteNo.CompareTo(txtEndSiteNo.Text) <= 0;
IQueryable<dimsite> query = context.DimSites.Where(siteNodeExpTree);AspNetPager1.RecordCount = query.Count();</dimsite>
这样简练多了.
分享到:
相关推荐
LINQ to SQL语句(15)之String LINQ to SQL语句(16)之对象标识 LINQ to SQL语句(17)之对象加载 LINQ to SQL语句(18)之运算符转换 LINQ to SQL语句(19)之ADO.NET与LINQ to SQL LINQ to SQL语句(20)之存储过程 LINQ to ...
LINQ TO SQL[1] 是包含在.NET Framework 3.5 版中的一种 O/RM 组件(对象关系映射),O/RM 允许你使用 .NET 的类来对关系数据库进行建模。然后,你可以使用LINQ对数据库中的数据进行查询、更新、添加、删除。 LINQ TO ...
LINQ To SQL实现分页效果源码 VS2008 Frameworks3.5 LINQ To SQL 实现分页效果 数据库SQL 2005
一个简单的linq to sql c#例子 实现数据库操作基本功能
实现linq多个查询条件连接功能(支持linq to sql 和linq to entity)。 按多个指定属性排序功能。 不同参数的lamdba表达式条件间的转换功能。
linq基础 linq to sql linq基础 linq to sql
ASP.NET MVC+LINQ TO SQL登陆
LINQ to SQL语句(21)之用户定义函数 80 1.在Select中使用用户定义的标量函数 80 2.在Where从句中 使用用户定义的标量函数 81 3.使用用户定义的表值函数 83 4.以联接方式使用用户定义的表值函数 84 LINQ to SQL语句...
自己学linq to sql时做的demo
一步一步学 Linq to sql 一步一步学 Linq to sql.doc 一步一步学 Linq to sql.doc
LINQ to SQL可视化调试工具,下载文件包括一个可视化调试工具的.dll程序集(在bin\debug文件夹下),而且还包含了源代码!算是小小的补偿吧:)
LINQ to SQL 学习资料 保存的网页
linq to sql实现分层与gridview使用实现增删改,适合新手做三层项目开发,快速入门
LINQ to SQL和Entity Framework对比与关联LINQ to SQL和Entity Framework对比与关联
Linq to Sql 教程大全
详细介绍linq to sql的使用方法和注意要点
留言薄,使用LINQ TO SQL 开发,供大家了解LINQ TO SQL
LINQ to SQL语句(15)之String
完整的linq to sql 学习笔记。
linq to sql 标准实例,有兴趣的可以学习下