解决Entity Framework查询匿名对象后的跨域访问的一种方式
在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递。但是很多时候,我们不需要把整个表的字段都查出来,如果我们直接把整个数据实体查询出来,就极大的影响了性能,所以我们需要通过查询匿名对象或者已经定义的方式,对数据库进行查询;
1.实例使用的数据实体类:
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
2.查询
假设我们需要现实一个分类目录,我们只需要Id和Name两个字段,我们可以建立一个新的CategoryView
public class CategoryView
{
public int Id { get; set; }
public string Name { get; set; }
}
查询的时候,可以这样做,让它直接生成CategoryView的列表:
var data1 = from c in context.Categoriees
select new CategoryView()
{
Id = c.Id,
Name = c.Name
};
这样,可以在将方法返回值设置为IQueryable<CategoryView>类型,在调用方法处可以直接遍历;
然而,当没有CategoryView的时候,我们就只能使用匿名对象进行查询:
var data = from c in context.Categoriees
select new
{
cId = c.Id,
cName = c.Name
};
这样的查询之后,同样可以直接通过cId和cName取值,但是仅限当前方法内部,如果跨域访问的话,就没法直接读出cId和cName的值了:
CategoryService类的实现如下所示:
namespace ConsoleApplication1
{
public class CategoryService
{
private ShopContext context=new ShopContext(); public IQueryable<object> GetAllCategories()
{
var data = from c in context.Categoriees
select new
{
cId = c.Id,
cName = c.Name
};
return data;
}
}
}
调用方法:
CategoryService service=new CategoryService();
IQueryable<object> data = service.GetAllCategories();
这时,我们是没法直接读取object类型的属性值的,在不考虑性能的前提下,我们可以使用反射,得到属性值:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
CategoryService service=new CategoryService();
IQueryable<object> data = service.GetAllCategories();
foreach (var item in data)
{
Type type = item.GetType();
PropertyInfo idProperty = type.GetProperty("cId");
string id = idProperty.GetValue(item, null).ToString();
PropertyInfo nameProperty = type.GetProperty("cName");
string name = nameProperty.GetValue(item, null).ToString(); Console.WriteLine("Id:"+id+" Name:"+name);
}
Console.ReadKey();
}
}
}
当然,这样的操作,如果您觉得性能的问题不比需要建立CategoryView模型类造成的麻烦多的话,还是一种比较简单快捷的实现方式,但是我的建议还是建立像CategoryView这样的视图模型类,可以发这个类对象传递给视图直接显示,何乐不为!!!
3.目前为止我所知的最好的跨域访问方式
在c#4.0中,加入了dynamic特性,这使得我们可以使用它支持对动态类型的解释,虽然c#语言绝对是静态类型的,但是dynamic通过在编译的时候,不推断出具体类型,而是展开为表达式数的形式,在最后执行期间使用代理去执行调用的方法,是对匿名类型的调用比使用反射机制更加高效便捷了,所以,对于上述实例,可以使用如下方式进行调用:
foreach (dynamic item in data)
{
Console.WriteLine(item.cId);
}
而我们失去的,只是visual studio的智能提示而已,所以目前看来,这是最适当的一种方法,当然,如果是和UI层链接的服务层,我仍然推荐使用查询ViewModel的方式
解决Entity Framework查询匿名对象后的跨域访问的一种方式的更多相关文章
- 解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题
问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, ...
- Springboot中关于跨域问题的一种解决方法
前后端分离开发中,跨域问题是很常见的一种问题.本文主要是解决 springboot 项目跨域访问的一种方法,其他 javaweb 项目也可参考. 1.首先要了解什么是跨域 由于前后端分离开发中前端页面 ...
- Entity Framework查询原理
Entity Framework查询原理 前言 Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Rela ...
- Entity Framework查询生成大量的子查询,如何避免?求救
最近使用Entity Framework做一个中型的项目,一张表含有千万条数据,并没有使用很复杂的查询,只是程序上使用了DTO进行帅选数据,且使用了分页,效果很不理想.经过跟踪sql,我发现很多简单的 ...
- 《ASP.NET MVC4 WEB编程》学习笔记------Entity Framework的Database First、Model First和Code Only三种开发模式
作者:张博出处:http://yilin.cnblogs.com Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发 ...
- 用jQuery与JSONP轻松解决跨域访问的问题【转】
原文地址:http://www.jb51.net/article/46463.htm 好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅 ...
- Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置
Asp.Net SignalR 使用记录 工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...
- 【转】解决ajax跨域问题的5种解决方案
转自: https://blog.csdn.net/itcats_cn/article/details/82318092 什么是跨域问题?跨域问题来源于JavaScript的"同源策略& ...
- 对象存储 COS 帮您轻松搞定跨域访问需求
背景 早期为了避免 CSRF(跨站请求伪造) 攻击,浏览器引入了 "同源策略" 机制.如果两个 URL 的协议,主机名(域名/IP),端口号一致,则视为这两个 URL " ...
随机推荐
- Gluon Data API
http://mxnet.apache.org/api/python/gluon/data.html import sys import os import time import mxnet as ...
- 10、SpringBoot-CRUD登陆拦截
1.前端页面的设置 index.html <input type="text" class="form-control" name="usern ...
- js算法排序
一.选择算法排序(算法时间复杂度为O(n²)级别) 选择排序就是选择数组中的最小的树,依次排序.第一次选择最小的数放在第一位,第二次从剩余的元素中寻找最小的元素放在第二位,第三次在剩余的数中选择最小的 ...
- 文件上传之FileItem使用
一.介绍 FileItem类的常用方法: 1.boolean isFormField().isFormField方法用来判断FileItem对象里面封装的数据是一个普通文本表单字段(true),还是一 ...
- linux下构建SVN
1. 安装subversion#yum -y install subversion2. 安装好了之后 新建一个svn目录#mkdir /home/svn3. 新建两个版本仓库#svnadmin cre ...
- iOS之序列化与反序列化
所谓的序列化和反序列化就是将数据结构或对象和二进制串之间相互转换的过程: 本人的理解是当你于写数据需要本地存储时,即将你的数据写到硬盘上的时候,你就必须对他进行序列化,转换成二进制文件,从而便于在磁盘 ...
- Vue教程:组件Component详解(六)
一.什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功 ...
- 一点一点看JDK源码(二)java.util.List
一点一点看JDK源码(二)java.util.List liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 List译为表,一览表, ...
- 工具 | Axure基础操作 No.4
昨天因为有事没有学习,很愧疚,今天赶紧补上.俗话说,"学如逆水行舟,不进则退"还是很有道理的. 1.设置页面内容格式 这里主要是在浏览器中的内容所出现的对齐格式,左对齐或者是居中对 ...
- UICollectionView reloadItemsAtIndexPaths时 报错
在刷新下载进度时 Xcode报错误: Terminating app due to uncaught exception 'NSInternalInconsistencyException', rea ...