ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NET问答: 如果动态构建 Query 查询 EntityFramework

2021-05-10 21:33:28  阅读:126  来源: 互联网

标签:filter set get EntityFramework var Query NET public


 目录

咨询区

回答区

点评区


咨询区

Eduard

我想知道如何在 EntityFramework 或者 Linq 上构建动态查询。

我现在要做这么一个功能,UI上大概有 50+ 的查询条件,用户可以根据自己的需求勾选所需的条件传到我的后端服务方法中。

我知道可以通过 ExpresstionTree 去动态拼接这样的条件,但我不喜欢这种方法,我想知道有没有更简单的方式,并且类型安全。

回答区

Slauma

你可以一步一步的组合 IQueryable<T>,起初你可以有一个 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 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;
}

Gurmit Teotia

我自己封装了一个 泛型仓储 [https://github.com/gurmitteotia/EFDataAccess] ,  我觉得对你应该有用,它提供了统一化的API接口,可参考下面的例子。

       //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);

虽然我不知道你的查询 DTO,但你可以很容易的构建泛型 Query 并塞入你的 DTO 实体,我已经用它好多年了,绝对好用。

点评区

在纯sql时代,这个需求很简单,不断的 += 拼接即可,反而在 强类型 下却不是那么好做了,不过我觉得 Gurmit Teotia 大佬封装的 Query 框架还挺好用的,支持一下。

标签:filter,set,get,EntityFramework,var,Query,NET,public
来源: https://blog.csdn.net/mzl87/article/details/116598111

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有