2

ASP.NET Web API と Entity Framework 5 と LINQ to Entities を使用してアプリケーションを設計しています。Web API は、エンティティを直接提供するのではなく、エンティティを類似しているが同一ではない一連のデータ転送オブジェクトに変換します。この API は最初は Silverlight アプリケーションで使用されますが、今後は非 .NET クライアント (iOS アプリなど) をサポートする必要があります。また、クライアントが API に対して堅牢な一連のクエリを実行できるようにしたいと考えています。

これらの要件により、クエリ オブジェクト パターンを検討するようになりました。基本的には、独自のクエリ オブジェクトをクライアント側で作成し、それを Web API にポストして、そのクエリ オブジェクトを LINQ to Entities で使用できるラムダ式に変換したいと考えています。この最後の部分は、私をつまずかせているものです。

単純な比較クエリから始めて、実行時に次のようなオブジェクトをラムダ式に変換できるようにしたいと考えています。

public enum QueryOperator
{
    None = 0,
    GreaterThan,
    GreaterThanOrEqualTo,
    EqualTo,
    NotEqualTo,
    LessThanOrEqualTo,
    LessThan
}

public class SimpleQuery<T>
{
    public SimpleQuery()
    {
        this.Field = null;
        this.Operator = QueryOperator.None;
        this.Value = null;
    }

    public string Field { get; set; }
    public QueryOperator Operator { get; set; }
    public object Value { get; set; }

    public IEnumerable<T> Execute(IQueryable<T> queryTarget)
    {
        // ????
    }
}

これどうやってするの?

4

1 に答える 1

1

私は過去にこのようなことをしなければなりませんでした。これが私が思いついたものです:

public IEnumerable<T> Execute(IQueryable<T> queryTarget)
{
    return queryTarget.Where(this.GetWhereExpression<T>());
}

private Expression<Func<T, bool>> GetWhereExpression<T>()
{
    var param = Expression.Parameter(typeof(T), "x");
    var prop = Expression.Property(param, this.Field);
    var value = Expression.Constant(this.Value, prop.Type);
    Expression compare = null;
    switch(this.Operator) 
    {
        case QueryOperator.EqualTo:
            compare = Expression.Equal(prop, value);
            break;
        ...
    }

    return Expression.Lambda(compare, param);
}
于 2013-04-02T15:50:20.243 に答える