复古网站设计,好搜搜索,中国logo设计公司排名,哈尔滨市工程建设监理有限公司咨询区 Eduard#xff1a;我想知道如何在 EntityFramework 或者 Linq 上构建动态查询。我现在要做这么一个功能#xff0c;UI上大概有 50 的查询条件#xff0c;用户可以根据自己的需求勾选所需的条件传到我的后端服务方法中。我知道可以通过 ExpresstionTree 去动态拼接这样… 咨询区 Eduard我想知道如何在 EntityFramework 或者 Linq 上构建动态查询。我现在要做这么一个功能UI上大概有 50 的查询条件用户可以根据自己的需求勾选所需的条件传到我的后端服务方法中。我知道可以通过 ExpresstionTree 去动态拼接这样的条件但我不喜欢这种方法我想知道有没有更简单的方式并且类型安全。回答区 Slauma你可以一步一步的组合 IQueryableT起初你可以有一个 FilterDefinition 类表示可构建的 Query 实体类定义如下
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; }
}然后你就可以像下面这样一步步构建 Query 语句。
public IQueryableSomeEntity GetQuery(FilterDefinition filter)
{IQueryableSomeEntity query context.SetSomeEntity();// assuming that you return all records when nothing is specified in the filterif (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;
}Gurmit Teotia我自己封装了一个 泛型仓储 [https://github.com/gurmitteotia/EFDataAccess] , 我觉得对你应该有用它提供了统一化的API接口可参考下面的例子。//Filter on known fieldsvar keyboard QueryProduct.Create(pp.CategoryKeyboard);var keyboards repository.Get(keyboard);//Or filter on dynamic fieldsvar filter QueryProduct.Create(Rating, OperationType.GreaterThan, 4)var filteredKeyboards repository.Get(filter);//You can also combine two queries togathervar filterdKeyboards2 repository.Get(keyboard.And(filter))//Order it on known fieldsvar orderedKeyboard keyboard.OrderBy(oo.Asc(pp.Name));var orderedKeyboards repository.Get(orderedKeyboard);//Or order by on dynamic fieldsvar userOrdering keyboard.OrderBy(oo.Asc(Name));var orderedKeyboards2 repository.Get(userOrdering);虽然我不知道你的查询 DTO但你可以很容易的构建泛型 Query 并塞入你的 DTO 实体我已经用它好多年了绝对好用。点评区 在纯sql时代这个需求很简单不断的 拼接即可反而在 强类型 下却不是那么好做了不过我觉得 Gurmit Teotia 大佬封装的 Query 框架还挺好用的支持一下。