IQueryable in DynamicData project

本文关键字:project DynamicData in IQueryable | 更新日期: 2023-09-27 17:56:25

我正在使用动态数据项目,我正在尝试对IQueryable对象执行查询。我想执行一个查询,以检查文本是否包含在我的实体的"SubjectID"字段中。

这是我的过滤器类:

public partial class SubjectIDFilter : System.Web.DynamicData.QueryableFilterUserControl
    {
        protected void Page_Init(object sender, EventArgs e)
        {
        }
        public override System.Linq.IQueryable GetQueryable(System.Linq.IQueryable source)
        {
            if (string.IsNullOrEmpty(this.textBox.Text))
            {
                return source;
            }
            return source;
        }
        protected void btnSearch_Click(Object sender,
                           EventArgs e)
        {
            OnFilterChanged();
        }
        public override Control FilterControl
        {
            get
            {
                return this.textBox;
            }
        }
    }

代码应放在"GetQueryable"方法中。

我试图写"源。哪里..."但是 IDE 智能无法识别源对象上的那些 LINQ 方法("选择,位置.." )。我没有弄清楚如何使用"表达式"对象(对于 CreateQuery 方法)编写查询。

如何对该对象执行简单的SQL查询?

IQueryable in DynamicData project

你应该创建表达式并使用 IQueryProvider.CreateQuery 返回它。下面是执行所需操作的代码:

public override IQueryable GetQueryable(IQueryable source)
{
    if (string.IsNullOrEmpty(textBox.Text))
    {
        return source;
    }
    string filterValue = textBox.Text;
    ConstantExpression value = Expression.Constant(filterValue);
    ParameterExpression parameter = Expression.Parameter(source.ElementType);
    MemberExpression property = Expression.Property(parameter, Column.Name);
    if (Nullable.GetUnderlyingType(property.Type) != null)
    {
        property = Expression.Property(property, "Value");
    }
    Expression comparison = Expression.Call(property, typeof(string).GetMethod("Contains", new [] { typeof(string) }), value);
    LambdaExpression lambda = Expression.Lambda(comparison, parameter);
    MethodCallExpression where = Expression.Call(
        typeof(Queryable),
        "Where",
        new[] { source.ElementType },
        source.Expression,
        lambda);
    return source.Provider.CreateQuery(where);
}

此代码取自 Oleg 的 Sych 了解动态数据:筛选器模板博客文章 ASP.NET。它很好地了解了动态数据过滤机制背后发生的事情,我强烈推荐您阅读。