3

如果这已经被覆盖,我很抱歉,但我无法找到适合我的代码的解决方案。我是 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.Callwith来实现“不喜欢” Expression.Not。像魅力一样工作,谢谢。

4

1 回答 1

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);
...
于 2013-09-26T18:08:35.297 回答