2013-02-11 50 views
0

RavenDB提供了2個用於查詢數據的API,IDocumentQuery<T>用於高級lucene查詢,IRavenQueryable<T>用於強類型linq提供程序模型。無論查詢源如何動態調用RavenDB統計方法

它們共享一個名爲Statistics(out RavenQueryStatistics stats)的方法,該方法在運行時返回信息。

的2個不同的方法簽名是:

public interface IRavenQueryable<T> .... 
    { 
    IRavenQueryable<T> Statistics(out RavenQueryStatistics stats); 

public interface IDocumentQueryBase<T, out TSelf> 
          where TSelf : IDocumentQueryBase<T, TSelf> 
    { 
    TSelf Statistics(out RavenQueryStatistics stats); 

我開始了與

protected override dynamic SetupQuery(IDocumentSession session) 
    { 
     return session.Advanced.LuceneQuery<Foo>(new FooIndex().IndexName) 
       .WhereEquals("Bar", "Baz") 
       ;    
    } 

的意圖是,這種方法能夠被替換由其他班級。

我試圖消耗這是這樣:

using (var session = Store.OpenSession()) 
{ 
    RavenQueryStatistics stats=null; 
    var dynQuery= SetupQuery(session); 
    var dynQuery2 = dynQuery.Statistics(out stats); 
    //Results in cannot cast void to object 

    //next i tried using reflection 
    var refQuery= SetupQuery(session); 
    MethodInfo methodInfo = refQuery.GetType() 
      .GetMethod("Statistics", BindingFlags.Public, null, 
      new[] {typeof (RavenQueryStatistics).MakeByRefType()}, null); 


    var refQuery2= methodInfo.Invoke(query, new[] {stats}); 
    //results in NullReferenceException 

回答

1

您正在尋找的接口定義,但事實證明,動態調用最終調用AbstractDocumentQuery.Statistics,它返回void。 返回實例的方法實際上是作爲顯式接口方法實現的,所以動態調用不能調用它。

+0

所以這是根本不可能的? – 2013-02-12 13:39:27

+0

不是我所希望的,但謝謝你親自回答。 – 2013-02-12 14:21:47