Насколько я понимаю, ленивый поиск в raven db использует multiget, который использует post, а не get. Следовательно, ограничения длины URI не накладываются. Но с помощью следующего неудачного теста я выполняю запрос лениво и все еще получаю URI слишком длинное исключение. Что мне не хватает?
note: Мне нужно использовать Linq для построения предикатов.
[Test]
public void UseLongUriForLazySearch()
{
BuilderSetup.DisablePropertyNamingFor<User, string>(x => x.Id);
const int totalUsers = 2000;
var users = Builder<User>.CreateListOfSize(totalUsers).All()
.With(x => x.FirstName = GetRandom.FirstName())
.With(x => x.LastName = GetRandom.LastName())
.Build();
using (GetNewServer())
using (var store = new DocumentStore { Url = _serverAddress }.Initialize())
{
using (var session = store.OpenSession())
{
foreach (var user in users)
session.Store(user);
session.SaveChanges();
}
using(var session = store.OpenSession())
{
var ids = new List<string>();
var added = 0;
const int needed = 1900;
const int limit = 1024;
while (added < needed)
{
ids.AddRange(session.Query<User>().Select(x => x.Id).Skip(added).Take(needed - added).ToList());
added += limit;
}
var query = session.Query<User>().Where(x => x.Id.In(ids));
RavenQueryStatistics stats;
var results = query.Statistics(out stats).Skip(10).Take(100).Lazily();
Assert.AreEqual(100, results.Value.ToList().Count);
Assert.AreEqual(needed, stats.TotalResults);
}
}
}
Я добавляю полную трассировку стека для всех, кто интересуется. Я использую build 499.
System.UriFormatException: неверный URI: слишком длинная строка Uri.
Трассировка стека серверов:
в System.Uri.EscapeString (ввод строки, начало Int32, конец Int32, Char [] dest, ref Int32 destPos, логическое значение isUriString, char force1, Char force2, Char rsvd)
в System.Uri.EscapeUriString (String stringToEscape)
в Raven.Abstractions.Data.IndexQuery.AppendQueryString (путь StringBuilder) в c: \ Builds \ raven \ Raven.Abstractions \ Data \ IndexQuery.cs: строка 138
в Raven.Client.Document.Batches.LazyQueryOperation 1.CraeteRequest() in c:\Builds\raven\Raven.Client.Lightweight\Document\Batches\LazyQueryOperation.cs: line 26
at Raven.Client.Document.DocumentSession.<ExecuteLazyOperationsSingleStep>b__9(ILazyOperation x) in c:\Builds\raven\Raven.Client.Lightweight\Document\DocumentSession.cs: line 618
at System.Linq.Enumerable.WhereSelectListIterator
2.MoveNext ()
на System.Linq.Buffer 1..ctor(IEnumerable
1 источник)
в System.Linq.Enumerable.ToArray (IEnumerable 1 source)
at Raven.Client.Document.DocumentSession.ExecuteLazyOperationsSingleStep() in c:\Builds\raven\Raven.Client.Lightweight\Document\DocumentSession.cs: line 618
at Raven.Client.Document.DocumentSession.ExecuteAllPendingLazyOperations() in c:\Builds\raven\Raven.Client.Lightweight\Document\DocumentSession.cs: line 595
at Raven.Client.Document.DocumentSession.<>c__DisplayClass5
1.b__3 () в c: \ Builds \ raven \ Raven.Client.Lightweight \ Document \ DocumentSession.cs: строка 566
at System.Lazy`1.CreateValue ()