2

我正在使用 ASP.NET Web API 和 Entity Framework 5 以及 LINQ to Entities 设计一个应用程序。Web API 不直接提供实体,它将它们转换为一组与我的实体相似但不相同的数据传输对象。该 API 最初将由 Silverlight 应用程序使用,但我将不得不支持非 .NET 客户端(例如 iOS 应用程序)。我还想让客户端能够针对 API 运行一组强大的查询。

这些要求促使我考虑查询对象模式。本质上,我想在客户端创建一个本地查询对象,将其发布到 Web API,并将查询对象转换为我可以在 LINQ to Entities 中使用的 lambda 表达式。最后一部分是让我绊倒的地方。

从一个简单的比较查询开始,我希望能够在运行时将如下所示的对象转换为 lambda 表达式。

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 回答