gpt4 book ai didi

c# - Dynamic Linq to SQL - 不一样的地方

转载 作者:行者123 更新时间:2023-11-30 17:51:49 24 4
gpt4 key购买 nike

如果这已经涵盖了,我深表歉意,但我无法找到适合我的代码的解决方案。我是 Linq 的新手,仍然是 SQL 的初学者。我在 C# 和 ASP.Net 工作。

我为 IQueryable 设置了一个 WhereLike 扩展,这样我就可以动态选择要查询的列和数据。 (数据库有很多列,所以强类型化每一列将是一场噩梦。)这个 WhereLike 扩展很好用,但我需要知道如何将它更改为“NOT Like”。

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.Not 包装 Expression.Call 来实现“Not Like”。非常有用,谢谢。

最佳答案

要否定您的条件,只需将其包装到 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);
...

关于c# - Dynamic Linq to SQL - 不一样的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19020141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com