精进不休 .NET 4.0 (6) - ADO.NET Data Services 1.5 新特性

简介:
[索引页]
[源码下载]


精进不休 .NET 4.0 (6) - ADO.NET Data Services 1.5 新特性


作者: webabcd


介绍
ADO.NET Data Services 1.5 的新增功能
  • 支持服务端的 RowCount - 获取指定实体集合的成员数(只返回一个整型值,而不会返回实体集合) 
  • 支持服务端的分页 - 服务端可以返回分页后的数据,并且在其中还可以包含全部数据总数 
  • 支持服务端的 Select - 返回的结果只包括 Select 的字段 
  • 支持大数据传输 BLOB(binary large object)
  • 支持自定义数据服务 


示例
1、服务端 RowCount 的 Demo
MyDataService.svc.cs
using System; 
using System.Collections.Generic; 
using System.Data.Services; 
using System.Data.Services.Common; 
using System.Linq; 
using System.ServiceModel.Web; 
using System.Web; 

namespace DataAccess.DataServices.Service 

        [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults =  true)] 
         public  class MyDataService : DataService<MyEntity.AdventureWorksEntities> 
        { 
static void InitializeService() static void InitializeService(DataServiceConfiguration config) 
                { 
                        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
                        config.SetEntitySetAccessRule( "Products", EntitySetRights.All); 

                        // SetEntitySetPageSize( string name, int size) - 新增的方法。用于提供分页后的数据 
                        //          string name - 指定需要用于分页的实体集合 
                        //         int size - 分页的页大小 
                        config.SetEntitySetPageSize( "Products", 5); 
                } 
        } 
}
 
RowCount.aspx.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace DataAccess.DataServices 

         public partial  class RowCount : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        MyDataServiceProxy.AdventureWorksEntities context =  new MyDataServiceProxy.AdventureWorksEntities( new Uri( "http://localhost:9046/DataServices/Service/MyDataService.svc/")); 

                        // 支持服务端的 RowCount - 获取指定实体集合的成员数(只返回一个整型值,而不会返回实体集合) 
                        var productCount = context.Products.Count(); 
                        Response.Write(productCount.ToString()); 
                } 
        } 


/* 
$count - 返回 RowCount,即对应集合的成员数(只返回一个整型值,而不会返回实体集合) 
http://localhost:9046/DataServices/Service/MyDataService.svc/Products/$count 

$inlinecount=none - 只返回实体集合(分页后的数据) 
http://localhost:9046/DataServices/Service/MyDataService.svc/Products?$inlinecount=none 

$inlinecount=allpages - 在返回实体集合的基础上(分页后的数据),其中还会包括一个实体集合成员数(分页前的数据)的字段 
http://localhost:9046/DataServices/Service/MyDataService.svc/Products?$inlinecount=allpages 
*/
 
 
2、服务端分页的 Demo
MyDataService.svc.cs
using System; 
using System.Collections.Generic; 
using System.Data.Services; 
using System.Data.Services.Common; 
using System.Linq; 
using System.ServiceModel.Web; 
using System.Web; 

namespace DataAccess.DataServices.Service 

        [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults =  true)] 
         public  class MyDataService : DataService<MyEntity.AdventureWorksEntities> 
        { 
static void InitializeService() static void InitializeService(DataServiceConfiguration config) 
                { 
                        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
                        config.SetEntitySetAccessRule( "Products", EntitySetRights.All); 

                        // SetEntitySetPageSize( string name, int size) - 新增的方法。用于提供分页后的数据 
                        //          string name - 指定需要用于分页的实体集合 
                        //         int size - 分页的页大小 
                        config.SetEntitySetPageSize( "Products", 5); 
                } 
        } 
}
 
Paging.aspx.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace DataAccess.DataServices 

         public partial  class Paging : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        MyDataServiceProxy.AdventureWorksEntities context =  new MyDataServiceProxy.AdventureWorksEntities( new Uri( "http://localhost:9046/DataServices/Service/MyDataService.svc/")); 

                        // 支持服务端的分页 - 服务端可以返回分页后的数据,并且在其中还可以包含全部数据总数 
                        //         服务端代码:config.SetEntitySetPageSize( "Products", 5); 表示每页最多 5 条数据 
                        //         客户端代码:通过 Skip() 方法来控制需要跳过的记录数 
                        var products = context.Products.Skip(10); 

                        foreach (var product  in products) 
                        { 
                                Response.Write(product.ProductID.ToString() +  "<br />"); 
                        } 
                } 
        } 


/* 
$skip=[int] - 指定需要跳过的记录数 
http://localhost:9046/DataServices/Service/MyDataService.svc/Products?$skip=10 

$inlinecount=none - 只返回实体集合(分页后的数据) 
http://localhost:9046/DataServices/Service/MyDataService.svc/Products?$inlinecount=none 

$inlinecount=allpages - 在返回实体集合的基础上(分页后的数据),其中还会包括一个实体集合成员数(分页前的数据)的字段 
http://localhost:9046/DataServices/Service/MyDataService.svc/Products?$inlinecount=allpages 
*/
 
 
3、服务端 Select 的 Demo
MyDataService.svc.cs
using System; 
using System.Collections.Generic; 
using System.Data.Services; 
using System.Data.Services.Common; 
using System.Linq; 
using System.ServiceModel.Web; 
using System.Web; 

namespace DataAccess.DataServices.Service 

        [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults =  true)] 
         public  class MyDataService : DataService<MyEntity.AdventureWorksEntities> 
        { 
static void InitializeService() static void InitializeService(DataServiceConfiguration config) 
                { 
                        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
                        config.SetEntitySetAccessRule( "Products", EntitySetRights.All); 

                        // SetEntitySetPageSize( string name, int size) - 新增的方法。用于提供分页后的数据 
                        //          string name - 指定需要用于分页的实体集合 
                        //         int size - 分页的页大小 
                        config.SetEntitySetPageSize( "Products", 5); 
                } 
        } 
}
 
QueryProjection.aspx.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace DataAccess.DataServices 

         public partial  class QueryProjection : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        MyDataServiceProxy.AdventureWorksEntities context =  new MyDataServiceProxy.AdventureWorksEntities( new Uri( "http://localhost:9046/DataServices/Service/MyDataService.svc/")); 

                        // 支持服务端的  Select - 返回的结果只包括  Select 的字段 
                        var products = context.Products. Select(p =>  new { ProductID = p.ProductID, Name = p.Name }); 

                        foreach (var product  in products) 
                        { 
                                Response.Write(product.ProductID.ToString() +  ": " + product.Name +  "<br />"); 
                        } 
                } 
        } 


/* 
$ select=[column1,column2,column3,...] - 返回的实体集合数据中只包括指定的字段 
http://localhost:9046/DataServices/Service/MyDataService.svc/Products/?$ select=ProductID,Name 
*/
 
 
4、BLOB 的 Demo
BLOBService.svc.cs
/* 
ADO.NET Data Services 1.5 - 新增了对大数据传输 BLOB(binary large object)的支持 
需要在概念模型(ConceptualModels)中的相关实体上增加属性“m:HasStream= "true" xmlns:m= "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"” 
*/ 

using System; 
using System.Collections.Generic; 
using System.Data.Services; 
using System.Data.Services.Common; 
using System.Linq; 
using System.ServiceModel.Web; 
using System.Web; 

using System.IO; 

namespace DataAccess.DataServices.Service 

        [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults =  true)] 
         public  class BLOBService : DataService<MyEntity.AdventureWorksEntities>, IServiceProvider 
        { 
static void InitializeService() static void InitializeService(DataServiceConfiguration config) 
                { 
                        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
                        config.SetEntitySetAccessRule( "Products", EntitySetRights.All); 
                } 

object GetService() object GetService(Type serviceType) 
                { 
                         if (serviceType != typeof(System.Data.Services.Providers.IDataServiceStreamProvider)) 
                                return  null

                        // 调用服务的时候,如果指定了需要流式传输大数据对象,则通过我们自定义的流式文件传输对象去处理 
                        return  new ProductPhotoStreamProvider(); 
                } 
        } 

        /// <summary> 
        /// 自定义的一个流式文件传输类,需要实现 System.Data.Services.Providers.IDataServiceStreamProvider 接口 
        /// </summary> 
         public  class ProductPhotoStreamProvider : System.Data.Services.Providers.IDataServiceStreamProvider 
        { 
                /// <summary> 
                /// 获取流。将某个实体的某个属性以流类型的方式返回 
                /// </summary> 
                /// <param name= "entity">相关的实体</param> 
                /// <param name= "operationContext">当前数据服务请求的上下文</param> 
                /// <returns></returns> 
Stream GetReadStream() Stream GetReadStream(object entity,  string etag, bool? checkETagForEquality, DataServiceOperationContext operationContext) 
                { 
                         if (entity  as MyEntity.Product ==  null
                                return  null

                        int productId = (entity  as MyEntity.Product).ProductID; 

                        using (var context =  new MyEntity.AdventureWorksEntities()) 
                        { 
                                var product = context.Products.First(p => p.ProductID == productId); 
                                var stream =  new MemoryStream(product.ThumbNailPhoto); 
                                return stream; 
                        } 
                } 

Uri GetReadStreamUri() Uri GetReadStreamUri(object entity, DataServiceOperationContext operationContext) 
                { 
                        return  null
                } 

                // 流的内容类型 
string GetStreamContentType()  string GetStreamContentType(object entity, DataServiceOperationContext operationContext) 
                { 
                        return  "image/jpeg"
                } 

string GetStreamETag()  string GetStreamETag(object entity, DataServiceOperationContext operationContext) 
                { 
                        return  null
                } 

                // 流的缓冲区大小 
                 public int StreamBufferSize 
                { 
                         get { return 64; } 
                } 

void DeleteStream() void DeleteStream(object entity, DataServiceOperationContext operationContext) 
                { 
                        throw  new NotImplementedException(); 
                } 

System.IO.Stream GetWriteStream() System.IO.Stream GetWriteStream(object entity,  string etag, bool? checkETagForEquality, DataServiceOperationContext operationContext) 
                { 
                        throw  new NotImplementedException(); 
                } 

string ResolveType()  string ResolveType( string entitySetName, DataServiceOperationContext operationContext) 
                { 
                        throw  new NotImplementedException(); 
                } 
        } 
}
 
BLOB.aspx
<%@ Page Title= "" Language="C# " MasterPageFile="~/Site.Master " AutoEventWireup=" true
        CodeBehind= "BLOB.aspx.cs"  Inherits= "DataAccess.DataServices.BLOB" %> 

<asp:Content ID= "Content1" ContentPlaceHolderID= "head" runat= "server"
</asp:Content> 
<asp:Content ID= "Content2" ContentPlaceHolderID= "ContentPlaceHolder1" runat= "server"

        <!-- 
                查看元数据 - http://localhost:9046/DataServices/Service/BLOBService.svc/$metadata 
        --> 

        <!-- 
                Products(714) - 在 Products 集合中取主键为 714 的实体 
                $value - 取流数据 
        --> 
        <img src= "http://localhost:9046/DataServices/Service/BLOBService.svc/Products(714)/$value" alt= "image" /> 

</asp:Content>
 
 
5、自定义数据服务的 Demo
CustomDataService.svc.cs
/* 
ADO.NET Data Services 1.5 - 新增了对自定义数据服务的支持    
*/ 

using System; 
using System.Collections.Generic; 
using System.Data.Services; 
using System.Data.Services.Common; 
using System.Linq; 
using System.ServiceModel.Web; 
using System.Web; 

namespace DataAccess.DataServices.Service 

        [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults =  true)] 
         public  class CustomDataService : DataService<OrderContext> 
        { 
static void InitializeService() static void InitializeService(DataServiceConfiguration config) 
                { 
                        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
                        config.SetEntitySetAccessRule( "Orders", EntitySetRights.All); 
                        config.SetEntitySetAccessRule( "Products", EntitySetRights.All); 
                } 
        } 

        /// <summary> 
        /// 数据上下文 
        /// </summary> 
         public  class OrderContext 
        { 
                static List<Order> _orders; 
                static List<Product> _products; 
                static OrderContext() 
                { 
                        _orders =  new List<Order> 
                        { 
                                 new Order { OrderId = 0, Customer= "webabcd"}, 
                                 new Order { OrderId = 1, Customer= "webabcdefg"
                        }; 

                        _products =  new List<Product> 
                        { 
                                 new Product { ProductId = 0, ProductName= "wii", Price=100 },    
                                 new Product { ProductId = 1, ProductName= "xbox360", Price=200 },    
                                 new Product { ProductId = 2, ProductName= "ps3", Price = 300 },    
                                 new Product { ProductId = 3, ProductName= "nds", Price=50 }, 
                                 new Product { ProductId = 4, ProductName= "psp", Price=100 } 
                        }; 

                        _orders[0].Items.Add(_products[0]); 
                        _orders[0].Items.Add(_products[1]); 

                        _orders[1].Items.Add(_products[2]); 
                        _orders[1].Items.Add(_products[3]); 
                        _orders[1].Items.Add(_products[4]); 
                } 


                 public IQueryable<Order> Orders 
                { 
                         get { return _orders.AsQueryable<Order>(); } 
                } 

                 public IQueryable<Product> Products 
                { 
                         get { return _products.AsQueryable<Product>(); } 
                } 
        } 

        /* 
         * DataServiceKeyAttribute() - 指定主键字段 
         * EntityPropertyMapping() - 实体属性到 ATOM 字段的映射,以便生成一个友好格式的 Feed    
         */ 
        [EntityPropertyMapping( "Customer", SyndicationItemProperty.AuthorName, SyndicationTextContentKind.Plaintext,  true)] 
        [DataServiceKeyAttribute( "OrderId")] 
         public  class Order 
        { 
                 public int OrderId {  getset; } 
                 public  string Customer {  getset; } 

                 private List<Product> _items; 
                 public List<Product> Items 
                { 
                         get 
                        { 
                                 if (_items ==  null
                                        _items =  new List<Product>(); 

                                return _items; 
                        } 
                         set 
                        { 
                                _items = value; 
                        } 
                } 
        } 

        [DataServiceKeyAttribute( "ProductId")] 
         public  class Product 
        { 
                 public int ProductId {  getset; } 
                 public  string ProductName {  getset; } 
                 public int Price {  getset; } 
        } 
}
 
CustomDataService.aspx.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace DataAccess.DataServices 

         public partial  class CustomDataService : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        // 使用自定义数据服务提供的服务 
                        CustomDataServiceProxy.OrderContext context =  new CustomDataServiceProxy.OrderContext( new Uri( "http://localhost:9046/DataServices/Service/CustomDataService.svc/")); 

                        var orders = context.Orders; 

                        foreach (var order  in orders) 
                        { 
                                Response.Write(order.OrderId.ToString() +  "<br />"); 
                        } 
                } 
        } 
}
 
 
注:
以 URI 语法的方式查询 ADO.NET 数据服务的形式如下: 
http://[Url]/[ServiceName]/[EntityName]/[NavigationOptions]?[QueryOptions] 
详细语法参看 MSDN 


OK 
[源码下载]
 
 




     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/341317 ,如需转载请自行联系原作者
相关文章
|
5月前
|
人工智能 开发框架 .NET
.NET技术的强大功能:.NET技术的基础特性、在现代开发中的应用、以及它如何助力未来的软件开发。
.NET技术是软件开发领域的核心支柱,以其强大功能、灵活性及安全性广受认可。本文分三部分解析:基础特性如多语言支持、统一运行时环境;现代应用如企业级与Web开发、移动应用、云服务及游戏开发;以及未来趋势如性能优化、容器化、AI集成等,展望.NET在不断变化的技术环境中持续发展与创新。
147 4
|
2月前
|
自然语言处理 物联网 图形学
.NET 技术凭借其独特的优势和特性,为开发者们提供了一种高效、可靠且富有创造力的开发体验
本文深入探讨了.NET技术的独特优势及其在多个领域的应用,包括企业级应用、Web应用、桌面应用、移动应用和游戏开发。通过强大的工具集、高效的代码管理、跨平台支持及稳定的性能,.NET为开发者提供了高效、可靠的开发体验,并面对技术更新和竞争压力,不断创新发展。
103 7
|
2月前
|
开发框架 .NET C#
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位。从企业应用到电子商务,再到移动开发,.NET 均展现出卓越性能,助力开发者提升效率与项目质量,推动行业持续发展。
42 4
|
3月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
51 1
|
3月前
|
存储 编译器
.Net特性Attribute的高级使用
【10月更文挑战第14天】在.NET中,特性(Attribute)是一种强大的机制,用于在代码中添加元数据。本文介绍了特性的高级用法,包括自定义特性、通过反射读取特性、条件编译与特性结合、多个特性应用以及特性继承。通过示例展示了如何创建自定义特性类、应用自定义特性,并通过反射获取特性信息。此外,还介绍了如何利用条件编译符号实现不同版本的代码控制,以及如何在一个代码元素上应用多个特性。最后,探讨了如何通过`AttributeUsage`控制特性的继承行为。
|
5月前
|
数据采集 API 开发者
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
在.NET 8中,通过`ConfigurePrimaryHttpMessageHandler`方法,开发者能更精细地控制HTTP请求,这对于构建高效爬虫尤为重要。此特性支持定制代理IP、管理Cookie与User-Agent,结合多线程技术,有效应对网络限制及提高数据采集效率。示例代码展示了如何设置代理服务器、模拟用户行为及并发请求,从而在遵守网站规则的同时,实现快速稳定的数据抓取。
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
|
5月前
|
JSON API C#
闲话 .NET(6):.NET Core 各个版本的特性
闲话 .NET(6):.NET Core 各个版本的特性
146 0
|
6月前
|
人工智能 开发框架 Devops
.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。
【7月更文挑战第4天】.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。此外,讨论了.NET如何通过性能优化、DevOps集成、AI与ML支持以及开源策略应对未来挑战,为开发者提供强大工具,共创软件开发新篇章。
71 3
|
7月前
|
存储 编译器
【.NET Core】特性(Attribute)详解
【.NET Core】特性(Attribute)详解
407 2
|
8月前
|
数据挖掘 定位技术
.NET Compact Framework下的GPS NMEA data数据分析(二)转
.NET Compact Framework下的GPS NMEA data数据分析(二)转
57 0