RavenDb學習(六)查詢補充特性
阿新 • • 發佈:2022-04-29
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();