zoukankan      html  css  js  c++  java
  • 信息化基础建设 ORM 常见错误

    ORM 常见错误

    1. 根对象引用错误

    // order collection to fetch

    CustomerEntity myCustomer = new CustomerEntity(11091);

    // prepare prefetch (customer -> salesOrder)

    IPrefetchPath2 myCustomerPath = new PrefetchPath2((int)EntityType.CustomerEntity);

    myCustomerPath.Add(CustomerEntity.PrefetchPathSalesOrders);

    myCustomerPath.Add(SalesOrderEntity.PrefetchPathSalesOrderDetails);

    2. 在同级别的层次中使用SubPath多次

    // order collection to fetch

    CustomerEntity myCustomer = new CustomerEntity(11091);

    // prepare prefetch (customer -> salesOrder)

    IPrefetchPath2 myCustomerPath = new PrefetchPath2((int)EntityType.CustomerEntity);

    myCustomerPath.Add(CustomerEntity.PrefetchPathSalesOrders)

    .SubPath.Add(SalesOrderEntity.PrefetchPathSalesOrderDetails)

    .SubPath.Add(SalesOrderEntity.PrefetchPathShipMethod);

    3. PrefetchPath应该是在根对象中使用,非子对象

    // order collection to fetch

    EntityCollection<AddressEntity> addresses = new EntityCollection<AddressEntity>();

    // just wanna the addresses from Ottawa

    IPredicateExpression orderFilter = new PredicateExpression(AddressFields.City == "Ottawa");
    IRelationCollection orderRelations = new RelationCollection();

    orderRelations.Add(SalesOrderEntity.Relations.AddressEntityUsingShipToAddressId);

    在子对象中使用filter的例子

    // for those addresses, give their orders

    IPrefetchPath2 myAddressesPath = new PrefetchPath2((int)EntityType.AddressEntity);

    myAddressesPath.Add(AddressEntity.PrefetchPathShippedSalesOrders, 0, orderFilter, orderRelations);

    // fetch

    adapter.FetchEntityCollection(addresses, null, myAddressesPath);

    4. 在root entity上应用排序,并不会给子对象应用排序

    // addresses to fetch

    EntityCollection<AddressEntity> addresses = new EntityCollection<AddressEntity>();

    // want the orders sorted by totalDue(cheapeast first)

    SortExpression sorter = new SortExpression(SalesOrderFields.TotalDue | SortOperator.Descending);

    // use relations to be able to sort

    IRelationPredicateBucket bucket = new RelationPredicateBucket();

    bucket.Relations.Add(AddressEntity.Relations.SalesOrderEntityUsingShipToAddressId);

    // for those addresses, give their orders

    IPrefetchPath2 myAddressPath = new PrefetchPath2((int)EntityType.AddressEntity);

    myAddressPath.Add(AddressEntity.PrefetchPathShippedSalesOrders);

    // fetch

    adapter.FetchEntityCollection(addresses, bucket, 10, sorter, myAddressPath);

    在子对象中排序的方法

    // addresses to fetch

    EntityCollection<AddressEntity> addresses = new EntityCollection<AddressEntity>();

    // want the orders sorted by totalDue(cheapeast first)

    SortExpression sorter = new SortExpression(

    SalesOrderFields.TotalDue | SortOperator.Descending);

    // for those addresses, give me their orders (sorted)

    IPrefetchPath2 myAddressPath = new PrefetchPath2((int)EntityType.AddressEntity);

    myAddressPath.Add(AddressEntity.PrefetchPathShippedSalesOrders, 0, null, null, sorter);

    // fetch

    adapter.FetchEntityCollection(addresses, null, 10, null, myAddressPath);

    5. 一个root entity有多个子entity collection时,需要分别设置prefetchpath

    // the product to fetch

    ProductEntity myProduct = new ProductEntity(506);

    // prepare the path (product -> productDocuemnt -> document)

    IPrefetchPath2 myProductPath = new PrefetchPath2((int)EntityType.ProductEntity);

    myProductPath.Add(ProductEntity.PrefetchPathProductDocuments)

    .SubPath.Add(ProductDocumentEntity.PrefetchPathDocument);

    // fetch

    adatper.FetchEntity(myProduct, myProductPath);

    正确的代码

    // the product to fetch

    ProductEntity myProduct = new ProductEntity(506);

    // prepare the path (product -> productDocuemnt -> document,

    // product -> document)

    IPrefetchPath2 myProductPath = new PrefetchPath2((int)EntityType.ProductEntity);

    myProductPath.Add(ProductEntity.PrefetchPathProductDocuments)

      .SubPath.Add(ProductDocumentEntity.PrefetchPathDocument);

    myProductPath.Add(ProductEntity.PrefetchPathDocuments);

    // fetch

    adatper.FetchEntity(myProduct, myProductPath);

    6. The X -> Y -> X graph

    // order to fetch

    SalesOrderEntity myOrder = new SalesOrderEntity(43659);

    // prepare path (salesOrder -> customer -> salesOrder)

    IPrefetchPath2 myOrderPath = new PrefetchPath2((int) EntityType.SalesOrderEntity);

    myOrderPath.Add(SalesOrderEntity.PrefetchPathCustomer)

    .SubPath.Add(CustomerEntity.PrefetchPathSalesOrders);

    // fetch

    adaptter.FetchEntity(myOrder, myOrderPath);

    正确的写法

    // order to fetch

    SalesOrderEntity myOrder = new SalesOrderEntity(43659);

    // prepare path (salesOrder -> customer -> salesOrder)

    IPrefetchPath2 myOrderPath = new PrefetchPath2((int)EntityType.SalesOrderEntity);

    myOrderPath.Add(SalesOrderEntity.PrefetchPathCustomer)

        .SubPath.Add(CustomerEntity.PrefetchPathSalesOrders);

    // fetch

    Context myContex = new Context();

    adaptter.FetchEntity(myOrder, myOrderPath, myContex);

    7. 合并查询语句

    SELECT [Northwind].[dbo].[Customers].[ContactName] ,

    ISNULL(( SELECT COUNT([Northwind].[dbo].[Orders].[OrderID]) AS [OrderId]

    FROM ( [Northwind].[dbo].[Orders]

    INNER JOIN [Northwind].[dbo].[Customers] ON [Northwind].[dbo].[Customers].[CustomerID] = [Northwind].[dbo].[Orders].[CustomerID]

    )

    WHERE ( [Northwind].[dbo].[Customers].[CustomerID] = [Northwind].[dbo].[Orders].[CustomerID] )

    ), 0.) AS [Total]

    FROM [Northwind].[dbo].[Customers]

    这两个查询可以合并为一个查询

    SELECT * FROM [Customers] WHERE dbo.Customers.CustomerID='BERGS'

    SELECT COUNT(1) FROM dbo.Orders WHERE CustomerID='BERGS' --18

    --合并为一个查询的结果

    SELECT [Northwind].[dbo].[Customers].[ContactName] ,

    ISNULL(( SELECT COUNT([Northwind].[dbo].[Orders].[OrderID]) AS [OrderId]

    FROM [Northwind].[dbo].[Orders]

    WHERE ( [Northwind].[dbo].[Orders].[CustomerID] = [Northwind].[dbo].[Customers].[CustomerID] )

    ), 0.) AS [Total]

    FROM [Northwind].[dbo].[Customers]

    WHERE dbo.Customers.CustomerID='BERGS'

  • 相关阅读:
    Java常考面试题整理(一)
    TLPI读书笔记第29章:线程介绍
    TLPI读书笔记第57章-SOCKET:UNIX DOMAIN
    TLPI读书笔记第23章:定时器与休眠1
    java中线程安全的集合
    在springboot中使用jdbcTemplate
    springboot设置定时任务(转)
    springboot中使用swagger
    springboot中的@RequestMapping和@GetMapping(转)
    springboot在controller中传递参数
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/2079371.html
Copyright © 2011-2022 走看看