2017-09-17 3 views
0

Ich verwende Marder-Bibliothek https://github.com/JasperFx/MartenMarten JasperFx - Wie fügt man Abfrageausdrücke an?

Kann mir jemand sagen, wie Abfragen dynamisch anhängen? Eigentlich ist mein Code wie:

if (sortOrder == SortOrder.Ascending) 
{ 
    if (paging) 
     return session.Query<T>().OrderBy(keySelectorExp).Skip(skip).Take(take).ToList(); 

    return session.Query<T>().OrderBy(keySelectorExp).ToList(); 
} 
else 
{ 
    if (paging) 
     return session.Query<T>().OrderByDescending(keySelectorExp).Skip(skip).Take(take).ToList(); 

    return session.Query<T>().OrderByDescending(keySelectorExp).ToList(); 
} 

Was will ich bekommen, ist so etwas wie:

var query = session.Query<T>; 

if (sortOrder == SortOrder.Descending) 
    query.OrderByDescending(keySelectorExp); 
else 
    query.OrderBy(keySelectorExp); 

if (paging) 
    query.Skip(skip).Take(take); 

return query.ToList(); 

Irgendwelche Ideen?

Antwort

1

Sie erreichen dies, indem Sie das Ergebnis einfach der Variablen query zuweisen. Siehe den Code unten:

private IEnumerable<T> GetList<T>(IDocumentSession session, string sort, 
Expression<Func<T, object>> keySelectorExp, int? skip, int? take) 
    { 
     IQueryable<T> query = session.Query<T>(); 
     if (sort == "asc") 
      query = query.OrderBy(keySelectorExp); 
     else 
      query = query.OrderByDescending(keySelectorExp); 

     if (take.HasValue) 
      query = query.Skip(skip ?? 0).Take(take.Value); 

     return query.ToList(); 
    } 

und die Tests

public class UnitTest1 : IClassFixture<DocumentStoreFixture> 
{ 
    public class User 
    { 
     public Guid Id { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public bool Internal { get; set; } 
     public string UserName { get; set; } 
    } 

    private readonly DocumentStoreFixture _fixture; 
    public UnitTest1(DocumentStoreFixture fixture) 
    { 
     _fixture = fixture; 

     using (var session = _fixture.Store.LightweightSession()) 
     {     
      session.DeleteWhere<User>(u => true); 

      session.StoreObjects(new [] 
      { 
       new User { FirstName = "Han", LastName = "Solo" }, 
       new User { FirstName = "Bob", LastName = "Marley" }, 
       new User { FirstName = "Jessie", LastName = "Pinkman"} 
      }); 


      session.SaveChanges(); 
     } 
    } 
    [Fact] 
    public void Can_Order() 
    {    
     using (var session = _fixture.Store.LightweightSession()) 
     { 
      GetList<User>(session, "asc", u => u.LastName, null, null) 
      .Select(x => x.LastName) 
      .ShouldBe(new []{"Marley", "Pinkman", "Solo"}); 

      GetList<User>(session, "desc", u => u.LastName, null, null) 
      .Select(x => x.LastName) 
      .ShouldBe(new []{"Marley", "Pinkman", "Solo"}.Reverse()); 
     } 
    } 

    [Fact] 
    public void Can_OrderAndPage() 
    {    
     using (var session = _fixture.Store.LightweightSession()) 
     { 
      GetList<User>(session, "asc", u => u.FirstName, 1, 1) 
      .Select(x => x.FirstName) 
      .ShouldBe(new []{"Han"}); 

     } 
    } 
} 
public class DocumentStoreFixture 
{ 
    public IDocumentStore Store { get; } 

    public DocumentStoreFixture() 
    { 
     Store = DocumentStore.For("host=localhost;database=marten;username=marten;password=marten"); 
    } 
} 
Verwandte Themen