1. 程式人生 > 其它 >RavenDb學習(六)查詢補充特性

RavenDb學習(六)查詢補充特性

1、延遲載入
原來的查詢方式如下:
IEnumerable<User> users = session
    .Query<User>()
    .Where(x => x.Name == "john");

延遲載入方式:
Lazy<IEnumerable<User>> lazyUsers = session
    .Query<User>()
    .Where(x => x.Name == "John")
    .Lazily();

IEnumerable<User> users = lazyUsers.Value;

//一次執行所有延遲操作
IEnumerable<User> users = null;
IEnumerable<City> cities = null;
 
session
    .Query<User>()
    .Where(x => x.Name == "John")
    .Lazily(x => users = x);
 
session
    .Query<City>()
    .Where(x => x.Name == "New York")
    .Lazily(x => cities = x);
 
session.Advanced.Eagerly.ExecuteAllPendingLazyOperations();

//lucene的也支援
Lazy<IEnumerable<User>> users = session.Advanced
    .LuceneQuery<User>()
    .WhereEquals("Name", "John")
    .Lazily();

2、交集

在服務端進行交集操作,只返回符合全部條件的資料
session.Query<TShirt>("TShirtIndex")
       .Where(x => x.Manufacturer == "Raven")
       .Intersect()
       .Where(x => x.Types.Any(t => t.Color == "Blue" && t.Size == "Small"))
       .Intersect()
       .Where(x => x.Types.Any(t => t.Color == "Gray" && t.Size == "Large"))
       .ToList();

或者這麼寫
session.Advanced.LuceneQuery<TShirt>("TShirtIndex")
       .Where("Manufacturer:Raven INTERSECT Color:Blue AND Size:Small INTERSECT Color:Gray AND Size:Large")
       .ToList();

3、禁止快取和跟蹤
session.Query<User>().Customize(x => x.NoCaching());
session.Query<User>().Customize(x => x.NoTracking());

4、動態聚合
假設我們有一條這樣的sql語句
select sum(Total) from Orders where Total > 500 group by Product

linq的寫法是:
var result = session.Query<Order>("Orders/All")
                    .Where(x => x.Total > 500)
                    .AggregateBy(x => x.Product)
                        .SumOn(x => x.Total)
                    .ToList();

store的
store.DatabaseCommands.PutIndex("Orders/All", new IndexDefinitionBuilder<Order>()
{
    Map = orders => from order in orders
                    select new
                    {
                        order.Total,
                        order.Product,
                        order.Concurrency
                    },
    SortOptions = { { x => x.Product, SortOptions.Double } }
});

擴充套件查詢:
result = session.Query<Order>("Orders/All")
                .AggregateBy(x => x.Product)
                .AddRanges(x => x.Total < 100,
                           x => x.Total >= 100 && x.Total < 500,
                           x => x.Total >= 500 && x.Total < 1500,
                           x => x.Total >= 1500)
                .SumOn(x => x.Total)
                .ToList();

result = session.Query<Order>("Orders/All")
                .AggregateBy(x => x.Product)
                    .SumOn(x => x.Total)
                    .CountOn(x => x.Total)
                .AndAggregateOn(x => x.Concurrency)
                    .MinOn(x => x.Total)
                .ToList();

result = session.Query<Order>("Orders/All")
                .AggregateBy(x => x.Product)
                    .SumOn(x => x.Total)
                    .CountOn(x => x.Total)
                .AndAggregateOn(x => x.Concurrency)
                    .MinOn(x => x.Total)
                .ToList();