【问题标题】:Difference between Expression.Call overloads?Expression.Call 重载之间的区别?
【发布时间】:2009-03-10 08:49:03
【问题描述】:

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

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

谁能解释一下?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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


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

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

    【讨论】:

    • 没有接受泛型类型参数的 SqlMethods.Like 方法,所以这不可能是两个调用之间的区别。
    • 你错过了我回复的重点......正是因为它失败了......(通用类型args)
    • 啊,我明白了。与往常一样,仔细阅读文档是一个问题。感谢您的回复。
    • 很抱歉,我没有足够的声望来投票赞成你的答案...我会尽快回来。
    • @LeiYang 好吧,new Foo[n] 是一个“新数组,元素类型Foo,长度n” - 所以new Type[0] 只是一个新的空Type-数组,即没有内容的Type[]。实际上,Type.EmptyTypes 在没有额外分配的情况下是一样的。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      答案是下一个:

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

      【讨论】:

        猜你喜欢
        • 2015-02-09
        • 1970-01-01
        • 2014-08-16
        • 2011-04-08
        • 2012-11-24
        • 2013-06-05
        • 2021-09-29
        • 2020-05-27
        • 2016-03-23
        相关资源
        最近更新 更多