我有一个REST Web Api端点,可以接收查询参数。
其中一些查询参数用于生成具有内部模型属性的LINQ表达式。例如:
http://api.example.com/scenes?episode=32
查询参数episode
生成LINQ表达式:
s => s.Episode == 32
在每个查询参数具有的属性中指定了用于比较的属性:
public class SceneQueryData
{
[PropertyFilter("Episode")]
public int? Episode { get; set; }
}
我说:"Hey, use this "episode" query parameter as a filter for the "Episode" property of the model"
。
现在,生成的表达式是一个简单的相等比较(=
),因此我需要更复杂的操作(<, <=, >, >=
),因为我可以在属性中设置一个额外的成员:
[PropertyFilter("Episode", QueryOperations = new Dictionary<string, QueryOperation>()
{
{ "le", QueryOperation.LessThanOrEquals },
{ "lt", QueryOperation.LessThan },
{ "ge", QueryOperation.GreaterThanOrEquals },
{ "gt", QueryOperation.GreaterThan }
}]
这将允许我进行scenes?episode.le=20
之类的查询,这些查询将被翻译为
e => e.Episode <= 20.
但是,我不能将字典作为属性参数传递,因此我需要另一种方法来完成使用属性。
答案 0 :(得分:0)
使用AttributeUsage定义一个单独的属性(例如,OperationAttribute),使AllowMultiple = true。然后使用单独的OperationAttribute指定您将放入字典中的每个键值对。像这样:
[AttributeUsage(System.AttributeTargets.Property, AllowMultiple = true)]
public class OperationAttribute : Attribute
{
public OperationAttribute(string name, QueryOperation op)
{
...etc...
}
}
public class SceneQueryData
{
[PropertyFilter("Episode")]
[Operation("le", QueryOperation.LessThanOrEquals)]
[Operation("lt", QueryOperation.LessThan)]
[Operation("ge", QueryOperation.GreaterThanOrEquals)]
[Operation("gt", QueryOperation.GreaterThan)]
public int? Episode { get; set; }
}