我想知道使用实体框架和linq创建动态查询的最佳方法是什么。
我想创建一个具有许多用于排序和过滤的参数(超过50个)的服务。我将从gui中获取对象,这些对象将被填写…并且查询将从单个服务方法执行。
我环顾四周,发现可以动态创建一个可以在方法末尾执行的字符串。我不太喜欢这种方式。有一个更好的方法吗?最好输入带有编译检查的安全类型?
您可以IQueryable<T>逐步编写。假设您有一个FilterDefinition描述用户希望如何过滤的类…
IQueryable<T>
FilterDefinition
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; }