我看到小巧玲珑的伟大业绩和怎样使用它的一些样品。
我在想,如果我可以用它来提供的IQueryable数据,并使用ODATA将数据传送到用户界面(如网格,列表,...),其与UI层进行整合。
有没有办法返回小巧玲珑对象AsQueryable已不是IEnumerable的使用ODATA查询?
我看到小巧玲珑的伟大业绩和怎样使用它的一些样品。
我在想,如果我可以用它来提供的IQueryable数据,并使用ODATA将数据传送到用户界面(如网格,列表,...),其与UI层进行整合。
有没有办法返回小巧玲珑对象AsQueryable已不是IEnumerable的使用ODATA查询?
不,不是真的。 好了,你可以用与.AsQueryable()如果你真的想要的任何序列,但它也只是使用LINQ到对象。 小巧玲珑是故意简单; 它试图做的很少,但它做什么尝试做:它不该死的好(即使我不这样说我自己)。 一个适当的IQueryable接口是短小精悍的完全相反...
最近,我发现自己在这种情况下,我想用用小巧玲珑的OData,但我不希望使用实体框架的SQLite。
我的解决方案是创建一个ODataQueryOptions扩展方法,所以我的控制器看起来像这样
public IHttpActionResult GetDevices(ODataQueryOptions<User> queryOptions)
{
var usersQuery = new UserQuery(page, perPage);
var users = usersQuery.Search(queryOptions.WhereClause(), queryOptions.OrderByClause());
return Ok<IEnumerable<User>>(users);
}
这看起来简单,它为我工作,到目前为止,所以我与它坚持。 我不得不限制用户可以尽可能过滤器的OData关注
protected ODataValidationSettings _validationSettings =
new ODataValidationSettings
{
// These validation settings prevent anything except: (equals, and, or) filter and sorting
AllowedFunctions = AllowedFunctions.None,
AllowedLogicalOperators = AllowedLogicalOperators.Equal | AllowedLogicalOperators.And | AllowedLogicalOperators.Or | AllowedLogicalOperators.NotEqual,
AllowedArithmeticOperators = AllowedArithmeticOperators.None,
AllowedQueryOptions = AllowedQueryOptions.Filter | AllowedQueryOptions.OrderBy
};
这里是扩展方法
public static string WhereClause(this ODataQueryOptions options)
{
string s = "";
if (options.Filter != null && options.Filter.FilterClause != null)
{
var node = options.Filter.FilterClause.Expression as BinaryOperatorNode;
s = getWhereClause(node);
}
return s;
}
private static string getWhereClause(BinaryOperatorNode node)
{
// PARSE FILTER CLAUSE
// Parsing a filter, e.g. /Users?$filter=Id eq '1' or Id eq '100'
var s = "";
if (node.Left is SingleValuePropertyAccessNode && node.Right is ConstantNode)
{
var property = node.Left as SingleValuePropertyAccessNode ?? node.Right as SingleValuePropertyAccessNode;
var constant = node.Left as ConstantNode ?? node.Right as ConstantNode;
if (property != null && property.Property != null && constant != null && constant.Value != null)
{
s += $" {property.Property.Name} {getStringValue(node.OperatorKind)} '{constant.Value}' ";
}
}
else
{
if (node.Left is BinaryOperatorNode)
s += getWhereClause(node.Left as BinaryOperatorNode);
if (node.Right is BinaryOperatorNode)
{
s += $" {getStringValue(node.OperatorKind)} ";
s += getWhereClause(node.Right as BinaryOperatorNode);
}
}
return s;
}
要使用OData的使用短小精悍,你将不得不拦截Get(ODataQueryOptions<SpotView> queryOptions)
参数,分析它,并创建小巧玲珑的where子句出来。 您还需要考虑到在你的WebApiConfig.cs您有任何其他的OData设置
config.AddODataQueryFilter(new EnableQueryAttribute()
{
...
});
但是,你也可以使用的MySqlConnection与EF,你不必重新发明上述分析轮。 但是,那是你的决定,如果小巧玲珑的性能比使用一个完整的ORM喜欢EF已经有不同内置到它的执行更重要。