如果已经涵盖了这一点,我很抱歉,但我无法找到适合我的代码的解决方案。我是Linq的新手,仍然是SQL的初学者。我在C#和ASP.Net工作。
我为IQueryable设置了WhereLike扩展,以便我可以动态选择要查询的列和数据。 (数据库有很多列,因此强烈键入每个列都是一场噩梦。)这个WhereLike扩展很有用但我需要知道如何将它改为'不喜欢'。
public static IQueryable<T> WhereLike<T>(this IQueryable<T> source, string propertyName, string pattern)
{
if (null == source) throw new ArgumentNullException("source");
if (string.IsNullOrEmpty(propertyName)) throw new ArgumentNullException("propertyName");
//When using variables, system adds -> "'5555'"
if (pattern.StartsWith("'") && pattern.EndsWith("'"))
{ pattern = pattern.Substring(1, pattern.Length - 2); }
MethodInfo refmethod = typeof(SqlMethods).GetMethod("Like", new Type[] { typeof(string), typeof(string) });
var param = Expression.Parameter(typeof(T), "a");
var prop = Expression.Property(param, propertyName);
var value = Expression.Constant(pattern);
var body = Expression.Call(null, refmethod, prop, value);
var fn = Expression.Lambda<Func<T, bool>>(body, param);
return source.Where(fn);
}
在决定迁移到Linq之前,认为应用程序运行良好。这是我使用上面扩展名的代码:
// linq, column, data, type (0=not, 1=like)
protected IQueryable<FIM> setupLINQQueryFIM(IQueryable<FIM> linq, string a, string b, int c = 1)
{
if (c == 0)
{
linq = linq.WhereNotLike(a, b);
}
else if (c == 1)
{
linq = linq.WhereLike(a, b);
}
return linq;
}
我根据需要多次调用此函数,然后循环使用IQueryable的foreach语句将所有内容保存到DataTable。正如我所提到的,除非我无法使用WhereNotLike,否则它的效果很好。 如果可能或需要更多信息,请告诉我。
更新:根据以下评论;通过Expression.Call
包裹Expression.Not
,我发现我可以实现'不喜欢'。像魅力一样,谢谢。
答案 0 :(得分:1)
要否定您的情况,只需将其包装到Expression.Not - http://msdn.microsoft.com/en-us/library/bb299047.aspx
中...
var body = Expression.Not(Expression.Call(null, refmethod, prop, value));
var fn = Expression.Lambda<Func<T, bool>>(body, param);
...