FluentData入门(四)--Mapping

by kevin 13. 九月 2013 17:55 >

映射
自动映射 – 在数据库对象和.Net object自动进行1:1匹配

   1: List<Product> products = Context.Sql(@"select *
   2:             from Product")
   3:             .QueryMany<Product>(); 

自动映射到一个自定义的Collection:

   1: ProductionCollection products = Context.Sql("select * from Product").QueryMany<Product, ProductionCollection>(); 

如果数据库字段和POCO类属性名不一致,使用SQL别名语法AS:

   1: List<Product> products = Context.Sql(@"select p.*, 
   2:             c.CategoryId as Category_CategoryId, 
   3:             c.Name as Category_Name 
   4:             from Product p 
   5:             inner join Category c on p.CategoryId = c.CategoryId") 
   6:                 .QueryMany<Product>(); 

在这里p.*中的ProductId和ProductName会自动映射到Prodoct.ProductId和Product.ProductName,而Category_CategoryId和Category_Name 将映射到 Product.Category.CategoryId 和 Product.Category.Name.

使用dynamic自定义映射规则

   1: List<Product> products = Context.Sql(@"select * from Product") 
   2:             .QueryMany<Product>(Custom_mapper_using_dynamic); 
   3:  
   4: public void Custom_mapper_using_dynamic(Product product, dynamic row) 
   5: { 
   6:     product.ProductId = row.ProductId; 
   7:     product.Name = row.Name; 
   8: } 

使用datareader进行自定义映射:

   1: List<Product> products = Context.Sql(@"select * from Product") 
   2:             .QueryMany<Product>(Custom_mapper_using_datareader); 
   3:  
   4: public void Custom_mapper_using_datareader(Product product, IDataReader row) 
   5: { 
   6:     product.ProductId = row.GetInt32("ProductId"); 
   7:     product.Name = row.GetString("Name"); 
   8: } 

或者,当你需要映射到一个复合类型时,可以使用QueryComplexMany或者QueryComplexSingle。

   1: var products = new List<Product>(); 
   2: Context.Sql("select * from Product").QueryComplexMany<Product>(products, MapComplexProduct); 
   3:  
   4: private void MapComplexProduct(IList<Product> products, IDataReader reader) 
   5: { 
   6:     var product = new Product(); 
   7:     product.ProductId = reader.GetInt32("ProductId"); 
   8:     product.Name = reader.GetString("Name"); 
   9:     products.Add(product); 
  10: } 

多结果集

FluentData支持多结果集。也就是说,可以在一次数据库查询中返回多个查询结果。使用该特性的时候,记得使用类似下面的语句对查询语句进行包装。需要在查询结束后把连接关闭。

   1: using (var command = Context.MultiResultSql) 
   2: { 
   3:     List<Category> categories = command.Sql( 
   4:             @"select * from Category; 
   5:             select * from Product;").QueryMany<Category>(); 
   6:  
   7:     List<Product> products = command.QueryMany<Product>(); 
   8: } 

执行第一个查询时,会从数据库取回数据,执行第二个查询的时候,FluentData可以判断出这是一个多结果集查询,所以会直接从第一个查询里获取需要的数据。

分页

   1: List<Product> products = Context.Select<Product>("p.*, c.Name as Category_Name") 
   2:                    .From(@"Product p 
   3:                     inner join Category c on c.CategoryId = p.CategoryId") 
   4:                    .Where("p.ProductId > 0 and p.Name is not null") 
   5:                    .OrderBy("p.Name") 
   6:                    .Paging(1, 10).QueryMany(); 

调用 Paging(1, 10),会返回最先检索到的10个Product。

 

Mapping
Automapping - 1:1 match between the database and the .NET object:
List<Product> products = Context.Sql(@"select *
            from Product")
            .QueryMany<Product>();

Automap to a custom collection:
ProductionCollection products = Context.Sql("select * from Product").QueryMany<Product, ProductionCollection>();

Automapping - Mismatch between the database and the .NET object, use the alias keyword in SQL:
Weakly typed:
List<Product> products = Context.Sql(@"select p.*,
            c.CategoryId as Category_CategoryId,
            c.Name as Category_Name
            from Product p
            inner join Category c on p.CategoryId = c.CategoryId")
                .QueryMany<Product>();
Here the p.* which is ProductId and Name would be automapped to the properties Product.Name and Product.ProductId, and Category_CategoryId and Category_Name would be automapped to Product.Category.CategoryId and Product.Category.Name.

Custom mapping using dynamic:
List<Product> products = Context.Sql(@"select * from Product")
            .QueryMany<Product>(Custom_mapper_using_dynamic);

public void Custom_mapper_using_dynamic(Product product, dynamic row)
{
    product.ProductId = row.ProductId;
    product.Name = row.Name;
}

Custom mapping using a datareader:
List<Product> products = Context.Sql(@"select * from Product")
            .QueryMany<Product>(Custom_mapper_using_datareader);

public void Custom_mapper_using_datareader(Product product, IDataReader row)
{
    product.ProductId = row.GetInt32("ProductId");
    product.Name = row.GetString("Name");
}

Or if you have a complex entity type where you need to control how it is created then the QueryComplexMany/QueryComplexSingle can be used:
var products = new List<Product>();
Context.Sql("select * from Product").QueryComplexMany<Product>(products, MapComplexProduct);

private void MapComplexProduct(IList<Product> products, IDataReader reader)
{
    var product = new Product();
    product.ProductId = reader.GetInt32("ProductId");
    product.Name = reader.GetString("Name");
    products.Add(product);
}

Multiple result sets
FluentData supports multiple resultsets. This allows you to do multiple queries in a single database call. When this feature is used it's important to wrap the code inside a using statement as shown below in order to make sure that the database connection is closed.
using (var command = Context.MultiResultSql)
{
    List<Category> categories = command.Sql(
            @"select * from Category;
            select * from Product;").QueryMany<Category>();

    List<Product> products = command.QueryMany<Product>();
}
The first time the Query method is called it does a single query against the database. The second time the Query is called, FluentData already knows that it's running in a multiple result set mode, so it reuses the data retrieved from the first query.

Select data and Paging
A select builder exists to make selecting data and paging easy:
List<Product> products = Context.Select<Product>("p.*, c.Name as Category_Name")
                   .From(@"Product p
                    inner join Category c on c.CategoryId = p.CategoryId")
                   .Where("p.ProductId > 0 and p.Name is not null")
                   .OrderBy("p.Name")
                   .Paging(1, 10).QueryMany();
By calling Paging(1, 10) then the first 10 products will be returned.

分享到: 更多