0

我正在使用 Marten 库https://github.com/JasperFx/Marten

谁能告诉我如何动态追加查询?其实我的代码是这样的:

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();
}

我想要得到的是这样的:

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();

有任何想法吗?

4

1 回答 1

1

您可以通过简单地将结果分配给query变量来实现这一点。请看下面的代码:

    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();
    }

和测试

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");
    }
}
于 2017-09-22T20:27:18.070 回答