扩展IQueryable 对于Expression,Provider的疑问。

a157147899 2012-04-26 07:36:12
想给Linq To Entities扩展几个方法。(Like,In,Between)。

下面是Like的扩展代码:

#region 为IQueryable<T>类型实现Like操作
public static IQueryable<T> Like<T>(this IQueryable<T> query, Expression<Func<T, string>> lambda, string value)
{
return query.Provider.CreateQuery<T>(Expression.Call(lambda.Body,
typeof(string).GetMethod("Contains", new Type[] { typeof(string) }),
new Expression[] { Expression.Constant(value) }));
}
#endregion


执行时报了如下错误:

只能从实现 IQueryable 接口的实例构造 LINQ to Entities 查询表达式。
参数名: expression


反编译看了一下Queryable扩展类里Where的实现:

public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
return source.Provider.CreateQuery<TSource>(Expression.Call(null, ((MethodInfo) MethodBase.GetCurrentMethod()).MakeGenericMethod(new Type[] { typeof(TSource) }), new Expression[] { source.Expression, Expression.Quote(predicate) }));
}

这里Linq To Entities 应该是根据传入的MethodInfo来生成SQL。

现在在想是不是因为Provider里根本就不识别Like这个方法,
所以想直接通过扩展方法的方式来扩展Linq To Entities是不可能的?

博客园看了些例子,扩展的方式基本都是 先构造好对应的表达式树,然后将表达式树作为参数传入已有的Where()方法里。
...全文
154 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
a157147899 2012-04-27
  • 打赏
  • 举报
回复
额,帖子沉了
a157147899 2012-04-26
  • 打赏
  • 举报
回复
曹版主,Tim 来解答下呗

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧