0

私は動的データ プロジェクトを使用しており、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」メソッドに配置する必要があります。

「source.Where ...」を書き込もうとしましたが、IDE インテリジェンスはソース オブジェクトの LINQ メソッド (「Select, Where..」) を認識しません。"Expression" オブジェクト (CreateQuery メソッド用) を使用してクエリを作成する方法がわかりませんでした。

そのオブジェクトに対して単純な SQL クエリを実行するにはどうすればよいですか?

4

1 に答える 1

0

式を作成し、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動的データの理解:フィルターテンプレートのブログ投稿から抜粋したものです。これは、動的データフィルタリングメカニズムの内部で何が起こっているかについての良い洞察を提供します。私はあなたがそれを読むことを強くお勧めします。

于 2013-01-31T12:24:09.697 に答える