解决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的方式

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]

在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常。在服务执行过程中,我们手工抛出FaultExcept...

21310
来自专栏葡萄城控件技术团队

WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口

目录 WPF的消息机制(一)-让应用程序动起来 WPF的消息机制(二)-WPF内部的5个窗口 (1)隐藏消息窗口 (2)处理激活和关闭的消息的窗口和系统资源通知...

1715
来自专栏友弟技术工作室

Beego Models之二对象的 CRUD 操作高级查询

对 object 操作的四个方法 Read / Insert / Update / Delete

944
来自专栏Java呓语

DataBinding·常用注解说明

Observable接口提供给开发者添加/移除监听者的机制。为了使开发更便捷,我们创建了BaseObservable类,它已经实现了Observable接口中的...

914
来自专栏xingoo, 一个梦想做发明家的程序员

基于Dubbo的http自动测试工具分享

公司是采用微服务来做模块化的,各个模块之间采用dubbo通信。好处就不用提了,省略了之前模块间复杂的http访问。不过也遇到一些问题: PS: Githu...

2228
来自专栏大内老A

ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】

本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使...

1756
来自专栏前端杂货铺

深入seajs源码系列二

模块类和状态类 参照上文的demo,我们结合源码分析在简单的API调用的背后,到底使用了什么技巧来实现各个模块的依赖加载以及模块API的导出。        ...

3358
来自专栏技术博客

Entity Framework 系统约定配置

Code First之所以能够让开发人员以一种更加高效、灵活的方式进行数据操作有一个重要的原因在于它的约定配置。现在软件开发越来越复杂,大家都试图将软件设计的越...

572
来自专栏漫漫前端路

记录面试中一些回答不够好的题(Vue 居多)

grid 学习:https://www.jianshu.com/p/d183265a8dad

902
来自专栏程序员的SOD蜜

打造轻量级的实体类数据容器

    这里有三个关键词:轻量级,实体类,数据容器,还有一个潜在的关键词:通用。这几个名词之间有什么联系呢?     一般来说,操作实体类往往伴随着一个实体类集...

19610

扫描关注云+社区