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