动态Linq到SQL - 不喜欢的地方

时间:2013-09-26 05:37:17

标签: c# asp.net linq

如果已经涵盖了这一点,我很抱歉,但我无法找到适合我的代码的解决方案。我是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,我发现我可以实现'不喜欢'。像魅力一样,谢谢。

1 个答案:

答案 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);
...