当前位置:  开发笔记 > 编程语言 > 正文

Expression.Call重载之间的区别?

如何解决《Expression.Call重载之间的区别?》经验,为你挑选了1个好方法。

我试图为LINQ2SQL查询动态创建Where谓词:

...Where(SqlMethods.Like(r.Name, "%A%") ||
         SqlMethods.Like(r.Name, "%B%") ||
         SqlMethods.Like(r.Name, "%C%") || ...)

A,B,C等来自某些阵列.所以我尝试了以下方法:

var roleExpression = Expression.Parameter(typeof(Role), r);
var nameExpression = Expression.Property(roleExpression, "Name");
var termExpression = Expression.Constant("%" + term[i] + "%");
var likeExpression = Expression.Call(
    typeof(SqlMethods), "Like",
    new[] { typeof(string), typeof(string) }, nameExpression, termExpression);

但是,最后一行失败,并且类型为"System.Data.Linq.SqlClient.SqlMethods"的消息没有方法'Like'与提供的参数兼容.

所以我尝试了以下几行:

var likeExpression = Expression.Call(null,
    typeof(SqlMethods).GetMethod("Like", new[] { typeof(string), typeof(string) }),
    nameExpression, searchTermExpression)

这有效.但是,我不明白这两行之间的区别.在我看来,他们应该提供相同的结果.

有人能解释一下吗?

亲切的问候,
罗纳德威尔登伯格



1> Marc Gravell..:

我相信Type[]参数是针对泛型类型参数 - 即你试图调用:

SqlMethods.Like(...); // note the 

尝试传递一个空的Type[].


编辑重新混淆(评论); 我的观点是:你不应该为论证指定任何东西Type[].空数组或null都可以; 例如:

var likeExpression = Expression.Call(
    typeof(SqlMethods), "Like", null, nameExpression, termExpression);

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有