我试图为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)
这有效.但是,我不明白这两行之间的区别.在我看来,他们应该提供相同的结果.
有人能解释一下吗?
亲切的问候,
罗纳德威尔登伯格
我相信Type[]
参数是针对泛型类型参数 - 即你试图调用:
SqlMethods.Like(...); // note the
尝试传递一个空的Type[]
.
编辑重新混淆(评论); 我的观点是:你不应该为论证指定任何东西Type[]
.空数组或null都可以; 例如:
var likeExpression = Expression.Call( typeof(SqlMethods), "Like", null, nameExpression, termExpression);