2011-10-21 21 views
6

Aşağıdaki belge denilen Rezervasyon adres: Aşağıdaki projeksiyon sınıfı AyrıcaRavenDB'de iç içe geçmiş bilgiler nasıl sorgulanır?

{ 
    "CustomerId": 1, 
    "Items": [ 
     { 
      "EmployeeId": "employees/1", 
      "StartTime": "2011-08-15T07:20:00.0000000+03:00", 
      "EndTime": "2011-08-15T07:40:00.0000000+03:00" 
     }, 
     { 
      "EmployeeId": "employees/1", 
      "StartTime": "2011-08-15T07:40:00.0000000+03:00", 
      "EndTime": "2011-08-15T09:10:00.0000000+03:00" 
     }, 
     { 
      "EmployeeId": "employees/3", 
      "StartTime": "2011-08-16T07:20:00.0000000+03:00", 
      "EndTime": "2011-08-16T11:35:00.0000000+03:00" 
     } 
    ] 
    "ReservedAt": "2011-10-20T15:28:21.9941878+03:00" 
} 

var:

ben yazabilirim indeksi ve sorguda ne tür
public class ReservationItemProjection 
{ 
    public string ReservationId { get; set; } 
    public string CustomerId { get; set; } 
    public string EmployeeId { get; set; } 
    public DateTime StartTime { get; set; } 
    public DateTime EndTime { get; set; } 
} 

Ben ReservationItemProjections eşleşen bulmak isterseniz ? Örn .:

// invalid example query: 
var matches = docs.Query<ReservationItemProjection, 
    ReservationItemProjectionsIndex>() 
    .Where(x => 
     x.EmployeeId == "employees/1" && 
     x.StartTime >= minTime && 
     x.EndTime <= maxTime) 
    .ToList(); 

Ben Rezervasyon dokümanların bir listesi ama ReservationItemProjection nesnelerin listesini almak istemeyen lütfen unutmayın. documentation diyor ki:

Ancak belirli bir sorgu ile eşleşen belgeleri almanız yararlı olsa da, bundan daha iyisini yapabiliriz. Belgeleri kendileri almak yerine, tüm belgeyi almadan, değerleri doğrudan dizinden almak istiyorum.

public class ReservationItemProjectionsIndex : 
    AbstractIndexCreationTask<Reservation, ReservationItemProjection> 
{ 
    public ReservationItemProjectionsIndex() 
    { 
     Map = reservations => 
      from reservation in reservations 
      from item in reservation.Items 
      select new 
      { 
       ReservationId = reservation.Id, 
       CustomerId = reservation.CustomerId, 
       item.EmployeeId, 
       item.StartTime, 
       item.EndTime 
      }; 
     Store(x => x.ReservationId, FieldStorage.Yes); 
     Store(x => x.CustomerId, FieldStorage.Yes); 
     Store(x => x.EmployeeId, FieldStorage.Yes); 
     Store(x => x.StartTime, FieldStorage.Yes); 
     Store(x => x.EndTime, FieldStorage.Yes); 
    } 
} 

Bir şekilde sorgu ve dizin çalışma alınamıyor: o da için ReservationItemProjection yayın yapmayı mümkün değil varlık hakkında bir istisna atar

Zaten böyle bir dizini kullanarak denedi Rezervasyonu veya , Rezervasyonum Nesneleri alma olanağı bulduklarında, tüm Sorguları içeren tek bir Öğe, hatta sorgum olsa da, Sorgulama nerede-yan tümceler var x.EmployeeId == "employees/1" .

Özet: Gerekli dizin nedir? Dizinin yalnızca bir Map deyimine mi yoksa Azalt veya TransformResults'a mı ihtiyacı var? Sorguyu C# nasıl yazarım?

cevap

8

Kasper, RavenDB'de, belgelerini için sorgulıyorsunuz. İstediğiniz şeyi yapmak teknik olarak mümkün olsa da, genellikle bunu yapmak anlamsızdır, çünkü yansıtılan bilgi, onunla bir şeyler yapmak için gerekli bir içeriğe sahip değildir.

Yapmaya çalıştığınız şey nedir?

from doc in docs.Items 
from reservation in doc.Reservations 
select new { reservation.EmployeeId, reservation.Start, reservation.End } 

Sonra işareti ÇalışanNo, başlangıç ​​ve Store gibi End:

Başvuru için, endeks gibi bir şey olurdu.

Şimdi, sorgu, sayısında:

session.Query<...,...>().AsProjection<ReservationProjection>().ToList(); 

DB sağlayacak AsProjection çağrı Bu benim aradığım tam olarak sonuç verdi

+0

değil, belgeyi dizine değerleri istediğini biliyorum için! AsProjection gelişmiş bir özellik olarak kabul edilir mi? Google, [ravendb AsProjection] sayfasında yalnızca iki sonuç sayfası döndürür (http://www.google.com/search?q=ravendb+asprojection). Özelliğin bazı belgelere ihtiyacı var mı? –

+0

Teşekkürler, bu cevap bugün hayatımı kurtardı! –

İlgili konular