小编典典

使用实体框架创建动态查询

c#

我想知道使用实体框架和linq创建动态查询的最佳方法是什么。

我想创建一个具有许多用于排序和过滤的参数(超过50个)的服务。我将从gui中获取对象,这些对象将被填写…并且查询将从单个服务方法执行。

我环顾四周,发现可以动态创建一个可以在方法末尾执行的字符串。我不太喜欢这种方式。有一个更好的方法吗?最好输入带有编译检查的安全类型?


阅读 196

收藏
2020-05-19

共1个答案

小编典典

您可以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;
}
2020-05-19