LINQ动态查询的过程是怎么实现的呢?我们实现LINQ动态查询会用到还说呢么方法呢?扩展库Dynamic.cs的实现是什么效果呢?那么让我们来看看具体的内容。
LINQ动态查询已经由微软提供的一个LINQ动态查询扩展库Dynamic.cs实现(下载地址:http://msdn.microsoft.com/en-us/vcsharp/bb894665.aspx,该文件包含在\CSharpSamples\LinqSamples\DynamicQuery目录下),这个扩展库支持在Where方法中使用SQL查询表达式,这样我们可以在表示层或业务层构建SQL条件表达式,然后交给LINQ查询,遗憾的是,这个扩展库不支持SQL中的“Like”运算符,没有模糊查询功能的查询怎么能叫查询呢(拗口……)
事实上,动态查询库是利用Lambda表达式来实现动态查询功能的,因此只要对该扩展库再次进行扩展,让它支持LIKE操作符就是,实现起来并不困难。扩展库的原理是重载扩展方法Where,然后对传入的字符串形式的SQL条件表达式进行分析,最终生成Lambda式。明白这个原理后,修改起来也就很简单了。
找到ExpressionParser类,在TokenId枚举中增加一个枚举值:Like,在分析字符串表达式的方法中加入一个case条件,用来判断操作符是否为Like:
LINQ动态查询实现实例:
case 'L':
case 'l':
NextChar();
if (ch == 'I' || ch == 'i')
{
NextChar();
if (ch == 'K' || ch == 'k')
{
NextChar();
if (ch == 'E' || ch == 'e')
{
NextChar();
t = TokenId.Like;
}
}
}
break;
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
需要修改的还有几个方法,不再一一细述,目的都是为了对Like操作符进行检查,并转到查应的操作。***增加一个方法GenerateLike,用来产生支持模糊查询的Lambda表达式。代码如下:
//创建Like表达式
Expression GenerateLike(Expression left, Expression right)
{
string value = right.ToString().Replace("\"","");
right = RemovePrecent(value);
if (value.StartsWith("%") && value.EndsWith("%"))
{
MethodInfo method = left.Type.GetMethod("Contains");
return Expression.Call(left, method, new[] { right });
}
else if(value.StartsWith("%"))
{
MethodInfo method = left.Type.GetMethod(
"EndsWith", new[] { typeof(string) });
return Expression.Call(left, method, new[] { right });
}
else if (value.EndsWith("%"))
{
MethodInfo method = left.Type.GetMethod(
"StartsWith", new[] { typeof(string) });
return Expression.Call(left, method, new[] { right });
}
return GenerateEqual(left, right);
}
//去掉查询字符中的%符号
Expression RemovePrecent(string value)
{
return Expression.Constant(
value.Replace("%",String.Empty),
typeof(string));
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
LINQ动态查询的相关内容就向你介绍到这里,希望那个对你了解和学习LINQ动态查询有所帮助。
【编辑推荐】