【发布时间】:2013-04-02 15:45:35
【问题描述】:
我正在使用 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)
{
// ????
}
}
我该怎么做?
【问题讨论】:
-
Web API 支持对您公开为 IQueryable 的类型的本机查询功能。任何客户端(包括 iO)都可以通过用于过滤/投影/分页/等的 URI 使用 WCF 数据服务的通用查询语法设置。为什么要在这里重新发明轮子?
-
这是真的,但是(据我所知)它只支持通过 $filter 参数进行的非常简单的查询。我将需要比此功能更强大的查询功能,例如根据相关实体的值返回实体,即加入。据我所知,Web API 不支持这个。
标签: linq lambda linq-to-entities expression