Entity Framework 4.1 and Poco 使用存储过程联表查询

简介: 一:数据库支持 为了演示本例,我们创建了另外一个简单的示例数据库MiniNW,该数据库来自于ADO.NET Entity Framework Extensions,但在本例中,我们不会使用这个针对EF的扩展框架,因为它对POCO的支持不好,同时它也不支持DbContext,简单的说来就是它目前不支持EF4.1。

一:数据库支持

为了演示本例,我们创建了另外一个简单的示例数据库MiniNW,该数据库来自于ADO.NET Entity Framework Extensions,但在本例中,我们不会使用这个针对EF的扩展框架,因为它对POCO的支持不好,同时它也不支持DbContext,简单的说来就是它目前不支持EF4.1。

MiniNW可以在本示例代码的如下位置获得:

image

数据库对应关系如下(由于数据库相对简单,所以直接列出数据,从数据可以直观看出两表的关系):

image

二:生成POCO及DbContext

我们使用Entity Framework Power Tools CTP生成POCO及相关映射,如果你对此不熟悉,可参考本篇《使用Entity Framework和WCF Ria Services开发SilverLight之3:Map》。

三:主表从表数据一起关联查询

数据库中存在存储过程GetCategory:

ALTER proc [dbo].[GetCategory]
    @cid int
as
begin
    select *
    from Categories
    where @cid = cid
end

执行此存储过程的代码如下:

        public IEnumerable<Category> GetCategoryWithProductsWithID(int id)
        {
            var parameter = new SqlParameter
            {
                DbType = DbType.Int32,
                ParameterName = "cid",
                Value = id
            };
            //联表并延迟加载
            var result = (from p in this.Categories.SqlQuery("EXECUTE GetCategory @cid", parameter) select p).ToList();
            return result;
        }

得到的数据如下:

image

其中,Category所对应Products是延迟加载进来的,如果我们只使用Category,数据引擎就不会查询Products表的数据,但是,只要我们一到Category中查看Products,就会获取如上图这样的Products数据。请根据源码中的两个数据实体理解。

执行存储部分的代码EF为我们生成如下:

exec sp_executesql N'EXECUTE GetCategory @cid',N'@cid int',@cid=1

延迟加载部分的代码EF为我们生成如下:

exec sp_executesql N'SELECT 
[Extent1].[pid] AS [pid], 
[Extent1].[name] AS [name], 
[Extent1].[discontinued_date] AS [discontinued_date], 
[Extent1].[cid] AS [cid]
FROM [dbo].[Products] AS [Extent1]
WHERE [Extent1].[cid] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1

三:仅获取主表数据

如果不需要关联表的数据,我们可以像下面这样编码。以下这段代码使用的是和上文一样的存储过程:

        public IEnumerable<Category> GetCategoryWithID(int id)
        {
            var parameter = new SqlParameter
            {
                DbType = DbType.Int32,
                ParameterName = "cid",
                Value = id
            };
            //非联表
            var result = (from p in this.Categories.SqlQuery("EXECUTE GetCategory @cid", parameter)
                          select new
                          {
                              cid = p.cid,
                              name = p.name
                          }).ToList()
                         .Select(r => new Category()
                         {
                             cid = r.cid,
                             name = r.name
                         });
            return result;
        }

如果你对这段代码表示不很理解,请参看此文《使用Entity Framework和WCF Ria Services开发SilverLight之6:查找指定字段》。

获取数据如下:

image

四:由从表关联主表数据

从表关联主表的存储过程如下:

ALTER proc [dbo].[GetProductAndCategory]
    @pid int
as
begin
    select p.pid, p.[name] , p.discontinued_date, c.cid, c.[name] 
    from Products as p join Categories as c on p.cid = c.cid
    where p.pid = @pid    
end

注意,原始例子所带的存储过程不是这样的,多了这样的语句:

image

DbContext默认支持实体类型的字段和数据库视图是一个字段名,所以我们去掉了重命名部分。

实现此功能的代码如下:

        public IEnumerable<Product> GetProductAndCategoryWithID(int id)
        {
            var parameter = new SqlParameter
            {
                DbType = DbType.Int32,
                ParameterName = "pid",
                Value = id
            };
            //延迟加载
            var result = (from p in this.Products.SqlQuery("EXECUTE dbo.GetProductAndCategory @pid", parameter) select p).ToList();
            return result;
        }

要注意,主表的数据也是延迟加载的,只有使用到的时候才会被查询。

EF为我们生成的代码如下:

exec sp_executesql N'EXECUTE dbo.GetProductAndCategory @pid',N'@pid int',@pid=1

获取的数据如下:

image

源码下载:SLOperation20110703.zip

Creative Commons License本文基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
目录
相关文章
|
5天前
|
存储 人工智能 安全
AI 越智能,数据越危险?
阿里云提供AI全栈安全能力,为客户构建全链路数据保护体系,让企业敢用、能用、放心用
|
7天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
444 93
|
1天前
|
开发者
「玩透ESA」ESA启用和加速-ER在加速场景中的应用
本文介绍三种配置方法:通过“A鉴权”模板创建函数并设置触发器路由;在ESA上配置回源302跟随;以及自定义响应头。每步均配有详细截图指引,帮助开发者快速完成相关功能设置,提升服务安全性与灵活性。
283 2
|
7天前
|
SQL 人工智能 自然语言处理
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
随着生成式AI的普及,Geo优化(Generative Engine Optimization)已成为企业获客的新战场。然而,缺乏标准化流程(Geo优化sop)导致优化效果参差不齐。本文将深入探讨Geo专家于磊老师提出的“人性化Geo”优化体系,并展示Geo优化sop标准化如何帮助企业实现获客效率提升46%的惊人效果,为企业在AI时代构建稳定的流量护城河。
406 156
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
|
7天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
308 158