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

咨询区

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 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 = Query<Product>.Create(p=>p.Category=="Keyboard");var keyboards = repository.Get(keyboard);//Or filter on dynamic fieldsvar filter = Query<Product>.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(o=>o.Asc(p=>p.Name));var orderedKeyboards = repository.Get(orderedKeyboard);//Or order by on dynamic fieldsvar userOrdering = keyboard.OrderBy(o=>o.Asc("Name"));var orderedKeyboards2 = repository.Get(userOrdering);

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

点评区

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你真的不了解这个地球

全世界有3.14 % 的人已经关注了数据与算法之美1. 首先来看看地球&#xff0c;看起来不错哟&#xff0c;地球&#xff5e;2. 图中圈圈里头的人口&#xff0c;比其他地区的所有总和都还要多。3. 以整个地球史来看&#xff0c;曾活过的人类高达1150亿人&#xff0c;其中包括现存的…

drbd heartbeat mysql_Heartbeat+DRBD+MySQL Replication故障处理

不久前的一次机房网络故障&#xff0c;再一次对我们在HeartbeatDRBDMySQL数据库架构运维水平的一个考验&#xff0c;之前不止一次的测试与线上部署&#xff0c;还有之后大言不惭的关于该架构组件的所谓深入理解&#xff0c;在这一次不经意的意外面前又是“很囧”的收场&#xf…

Squid反向代理加速缓存+负载均衡实验架构

实验环境&#xff1a; 公司有两台web服务器&#xff0c;运行同一套网站&#xff0c;读取同一台mysql数据库。 两台web服务器的主机名如下&#xff1a; test1.com 192.168.1.119 test2.com 192.168.1.120 squid服务器ip&#xff1a;192.168.1.123 DNS: 192.168.9.254 实验思路&a…

levedb 导入 mysql_LevelDB-初始篇

简介&#xff1a;LevelDB是一个基于本地文件的存储引擎&#xff0c;非分布式存储引擎&#xff0c;原理基于BigTable(LSM文件树)&#xff0c;无索引机制&#xff0c;存储条目为Key-value。适用于保存数据缓存、日志存储、高速缓存等应用&#xff0c;主要是避免RPC请求带来的延迟…

c#中的多义关键字

newnew用三种场景&#xff0c;最常用的实例化&#xff0c;泛型参数时的实例化约束&#xff0c;第三种是显式隐藏继承成员。using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using s…

当时我就震惊了:无穷带来的各种悖论

全世界有3.14 % 的人已经关注了数据与算法之美希尔伯特旅馆悖论&#xff08;Hilberts paradox of Grand Hotel&#xff09;希尔伯特旅馆有无限个房间&#xff0c;并且每个房间都住了客人。一天来了一个新客人&#xff0c;旅馆老板说&#xff1a;“虽然我们已经客满&#xff0c;…

重载运算符操作_学习

//A: 操作符重载实现为类成员函数 /* #include <iostream> class Person { private:int age; public:Person(int a){this->agea;}//inline bool operator(const Person &ps)const;inline bool operator(const Person *ps)const; }; //inline bool Person::operat…

砸了140亿的计算机视觉,未来到底如何?

指纹解锁、刷脸识别、语音转换文字、机器人看病、Alphago我们已经深刻的感受到&#xff0c;人工智能在改变我们的工作方式和认知。通过 SAS 针对企业人工自能就绪调研的报告可以看到&#xff0c;大部分企业认为人工智能还处于初期阶段&#xff0c;“目前&#xff0c;我们正在部…

记一次 .NET WPF布草管理系统 挂死分析

一&#xff1a;背景 1. 讲故事这几天看的 dump 有点多&#xff0c;有点伤神伤脑&#xff0c;晚上做梦都是dump&#xff0c;今天早上头晕晕的到公司就听到背后同事抱怨他负责的WPF程序挂死了&#xff0c;然后测试的小姑娘也跟着抱怨。。。嗨&#xff0c;也不知道是哪一个迭代改出…

轻量级HTTP服务器Nginx(安装篇)

一、下载与安装Nginx Nginx的官方网站是http://sysoev.ru/nginx/&#xff0c;英文主页为http://nginx.net&#xff0c;从这里可以获得Nginx的最新版本信息。Nginx有三个版本&#xff1a;稳定版、开发版和历史稳定版。开发版更新较快&#xff0c;包含最新的功能和bug的修复…

mysql视图实现的_mysql视图是什么?怎么实现?

mysql视图是什么&#xff1f;怎么实现&#xff1f;发布时间&#xff1a;2020-05-21 18:00:24来源&#xff1a;亿速云阅读&#xff1a;152作者&#xff1a;鸽子视图本身是一张虚拟表&#xff0c;不存放任何数据。在使用SQL语句访问视图的时候&#xff0c;获取的数据是MySQL从其它…

中国人的数学为什么好,为什么不好

全世界有3.14 % 的人已经关注了数据与算法之美世界人民已经懒得吐槽美国学生的数学水平了&#xff0c;正如他们已习惯于惊叹中国学生的天才。脱离计算器就不会四则运算&#xff0c;把sinx/n算成“six”&#xff0c;美国学生闹的笑话层出不穷&#xff0c;每隔一段时间&#xff0…

.NET Core 调用百度 PaddleOCR 识别图文

了解 PaddleOCR 之前&#xff0c;首先了解一下 PaddlePaddle。飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础&#xff0c;是中国首个开源开放、技术领先、功能完备的产业级深度学习平台&#xff0c;集深度学习核心训练和推理框架、基础模型库、端到端开发套…

SQL SERVER2000存储过程调试

sql server2000存储过程调试基础条件启用SQLDebugger 账户账户&#xff0c;这个一般都是开启的&#xff1b;mssqlserver服务要求使用指定用户(不是本地系统用户)&#xff0c;最好是administrator启动&#xff01;这个资料上这么说。但我用本地系统用户也是可以的&#xff1b;登…

华为机试支持python吗_4.10华为暑期实习生机试题目,python解答

第一题是给一个字符串&#xff0c;然后按照次数和ascii码的顺序&#xff0c;循环输出。比如输入eeefffggh&#xff0c;由于ascii的大小&#xff0c;e efgh efg ef efghefgef。字符串中可包含数字和大小写英文字母。 思路是先用dict统计个数&#xff0c;然后将所有可能…

大数据时代,数据科学都有些啥?

暑假咻地一下过完啦&#xff0c;前几天&#xff0c;小天介绍了关于数模课程的开学季限时优惠&#xff08;传送门&#xff09;&#xff0c;今天要介绍的是python课程。接下来&#xff0c;小天来详细说明一下&#xff01;19月17日~23日报名《python机器学习实战》即可享受限时330…

那些被.NET大厂拒绝的大佬们,究竟弱在哪里?

如火如荼的金三银四跳槽季迎来尾声&#xff0c;几家欢喜几家愁&#xff0c;既看到腾讯阿里百度的大厂offer&#xff0c;又羡慕30k、40k、50k的高薪&#xff0c;更多其实还是各种面试失蹄的故事。成功的案例五花八门&#xff0c;而失败的原因却千篇一律。据统计&#xff0c;约70…

在python中strip_python中strip()函数怎么用?

python中strip()函数怎么用&#xff1f;发布时间&#xff1a;2020-05-19 16:57:38来源&#xff1a;亿速云阅读&#xff1a;182作者&#xff1a;Leah今天小编为大家分享的是python中strip()函数的使用方法。代码详细容易理解&#xff0c;为此分享给大家做个参考。一起跟随小编过…

ObjectiveC 深浅拷贝学习

&#xff08;转自 http://woshao.com/article/f91898b24a1211e097d3000c2959fd2a/&#xff09; 在ObjC中&#xff0c;什么是深浅拷贝&#xff1f;深浅拷贝分别指深拷贝和浅拷贝&#xff0c;即mutableCopy和copy方法。copy复制一个不可变对象&#xff0c;而mutableCopy复制一个m…

SQL语言最佳实践

为单位制订的SQL规范&#xff0c;分享一下。首先说一下&#xff0c;这是公司用的一个规范&#xff0c;给到程序员做参考的。其实&#xff0c;这个规范是建立在对SQL有一定熟悉程序的基础上的&#xff0c;所以规范本身并不涉及SQL语法学习的相关内容。1. 绝对避免使用 SELECT *S…