public class FilterDefinition
{
public bool FilterByName { get; set; }
public string NameFrom { get; set; }
public string NameTo { get; set; }
public bool FilterByQuantity { get; set; }
public double QuantityFrom { get; set; }
public double QuantityTo { get; set; }
}
...然后你可以像这样构建一个查询:
public IQueryable<SomeEntity> GetQuery(FilterDefinition filter)
{
IQueryable<SomeEntity> query = context.Set<SomeEntity>();
// assuming that you return all records when nothing is specified in the filter
if (filter.FilterByName)
query = query.Where(t =>
t.Name >= filter.NameFrom && t.Name <= filter.NameTo);
if (filter.FilterByQuantity)
query = query.Where(t =>
t.Quantity >= filter.QuantityFrom && t.Quantity <= filter.QuantityTo);
return query;
}
//Filter on known fields
var keyboard = Query<Product>.Create(p=>p.Category=="Keyboard");
var keyboards = repository.Get(keyboard);
//Or filter on dynamic fields
var filter = Query<Product>.Create("Rating", OperationType.GreaterThan, 4)
var filteredKeyboards = repository.Get(filter);
//You can also combine two queries togather
var filterdKeyboards2 = repository.Get(keyboard.And(filter))
//Order it on known fields
var orderedKeyboard = keyboard.OrderBy(o=>o.Asc(p=>p.Name));
var orderedKeyboards = repository.Get(orderedKeyboard);
//Or order by on dynamic fields
var userOrdering = keyboard.OrderBy(o=>o.Asc("Name"));
var orderedKeyboards2 = repository.Get(userOrdering);
4 回答
我所知道的另一种方法是根据你的过滤器vaues构建一个IQueryable .
你可以一步一步地组成一个
IQueryable<T>
. 假设你有一个FilterDefinition
类来描述用户想要如何过滤......然后你可以像这样构建一个查询:
我创建了一个generic repository,它可以帮到你 . 它支持统一的API来查询和排序已知和动态字段:
我不知道您正在获取的搜索对象/ DTO,但您可以轻松创建通用搜索对象/ DTO,并可以在几行代码中将其映射到Query对象 . 我过去在WCF服务中使用它,它对我来说非常好用 .
您可以考虑使用WCF数据服务创建服务,并动态创建URI以查询实体模型 .