Expression.Call重载之间的区别?

时间:2009-03-10 08:49:04

标签: c# linq linq-to-sql lambda

我试图为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);

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

所以我尝试了以下一行:

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

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

有人能解释一下吗?

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

3 个答案:

答案 0 :(得分:9)

我认为Type[]参数适用于泛型类型参数 - 即您试图调用:

SqlMethods.Like<string,string>(...); // note the <string,string>

尝试传递空Type[]


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

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

答案 1 :(得分:0)

您可以使用Joseph Albahari和Ben Albahari的PredicateBuilder课程来构建您的where谓词

答案 2 :(得分:0)

答案是下一个:

Expression.Call(Nothing, GetType(System.Data.Linq.SqlClient.SqlMethods).GetMethod("Like", New Type() {GetType(String), GetType(String)}), New Expression() {left, right})