作者:NarratorWang | 来源:互联网 | 2023-05-17 22:33
ASP.NETMVC+EF项目,后台进行一个数据统计,2个表连接查询,只取其中的一些字段,返回的结果没有对应的实体类,应该返回什么类型?Controller中应该怎么进行转换处理?
ASP.NET MVC+EF 项目,后台进行一个数据统计,2个表连接查询,只取其中的一些字段,返回的结果没有对应的实体类,应该返回什么类型?Controller中应该怎么进行转换处理?
16 个解决方案
只取其中的一些字段 不就是new一个匿名类吗 直接用var接收多省事
SELECT NEW {你查询的字段=字段}; LINQ
@SayHello_XXXX 你说的是这个直接写在Controller里吗?我的目前是写在DAL层的
我所知道的有3种方法:
1. 自己写个类 专门用来接收这个查询的结果 然后到Controller自己做个Mapping 变成你前端所需要的数据结构
2. 就像3L说的用匿名函数 最后你那个查询方法的返回值就是object或者dynamic 然后Controller调用后用dynamic类型接收,然后就随意了
3. 用 EF code first 配置好实体类和数据库映射关系 然后查询的时候直接用主表的dbset对象并用Include方法把从表的导航属性包含进来 这样你就可以得到主从两张表的数据了 访问从表数据用导航属性直接访问就行 不过这样会把你不需要的字段也一起查出来 数据量大的时候可能会影响性能
如果以上有看不懂地方请自行百度或google
没有就按照你要的字段写一个类,然后select到这个类再传递到view
可以用你需要的字段重新写一个实体类,或者在查询时new匿名类来存数据!比如你只需要id和name查询返回匿名类,select new {id=Id,name=name}
比较标准的形式(考虑到工程需要复用并且需要强稳定性),是
从界面出发来设计实体,而不是从数据库表出发来设计实体。根据你的界面设计需求模式,通过分析综合,最后抽象出几种从粗略到详细的不同程度的实体对象。比如说对于“工作”这个概念来说,你可以分成4层,从最基本的工作(包括工作的发起人、发起时间、前一个工作id、工作当前存在状态、推送给什么人,等等),到具体一些各自有各自的特点的不同工作表单,中间你可以再分2层来表示不同的详细程度的实体。
从需求出发,而不是从数据库表出发,来设计实体,那么后续开发中你就不会怀疑自己的实体设计,不会心里总是生怕变繁琐了。实际上把具体的事情搞定,后续开发其实很快。你很少遇到“结果集无对应实体类”的问题,因为你出发点一直目的性很强,一开始就是围绕需求来设计详细程度不同的(对相同实体分不同层次的)实体。
那么反过来,假设不需要太认真,不需要保证高强度的稳定性(将来经常修改、出了问题总是可以事后补救,而不需要保证有稳定结构),那么你就可以使用运行时动态类型。例如 ExpandoObject 等等类型(通常使用 dynamic 来声明引用此类对象实例的变量),来进行动态编程。动态编程的问题当然就是不能保证静态编译检查,从而在用户面前出了 bug 你才知道有 bug。
不过编程语句其实不是很重要,如果能从工程上去理解就更好了。
总有人满脑子只有数据库表,因此对于“查询结果”无论如何也理解不了需要对应实体。
实际上,MVC 的实体 M 就是要主要用来对应各种查询的。你不能说数据库表有什么你就只知道这些实体,你的界面View需要两表查询结果、需要什么模式的数据源,你就应该单独设计这个数据源的实体模型。
从这个角度出发主动去设计各种查询实体,这才是 MVC 的基础。
用了EF还用数据库表驱动法思考问题就不对了。
用户列表,需要显示用户名和角色名称怎么办?
数据库表驱动法就是inner join User、Role两个表显示。
EF是用导航属性的方式,返回User,但是Include Roles属性
比较简单的方法就是在数据库建视图...查询视图就可以了.