gpt4 book ai didi

c# - Expression.Call 重载之间的区别?

转载 作者:太空狗 更新时间:2023-10-29 20:15:34 24 4
gpt4 key购买 nike

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

但是,最后一行失败并显示消息 No method 'Like' on type 'System.Data.Linq.SqlClient.SqlMethods' is compatible with the supplied arguments

所以我尝试了以下行:

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

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

谁能解释一下?

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

最佳答案

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

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

尝试传递一个空的 Type[]


编辑困惑(评论);我的观点是:您不应该为 Type[] 参数指定任何内容。一个空数组或 null 都可以;例如:

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

关于c# - Expression.Call 重载之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/629342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com