2014-05-23 87 views
2

我正在創建一個類來使用Azure表存儲執行CRUD功能。使用表達式抽取對Azure表存儲的查詢

我在這裏使用泛型類型。

我有下面的方法,我試圖通過一個表達式來使用TableQuery,但我有一些問題。

TableQuery<T> query = new TableQuery<T>().Where<T>(criteria);將無法​​編譯,並給我的消息

Cannot implicitly convert type 'System.Linq.IQueryable<T>' 
to 'Microsoft.WindowsAzure.Storage.Table.TableQuery<T>'. 
An explicit conversion exists (are you missing a cast?) 

我明白了消息,並知道它告訴我,我缺少強制,但我不能確定如何將其正確編碼。

我滿的方法是:

public List<T> GetSome<T>(Expression<Func<T, bool>> criteria) where T : ITableEntity, new() 
{ 

     TableQuery<T> query = new TableQuery<T>().Where<T>(criteria); // <---- This line isn't working 

     List<T> results = table.ExecuteQuery<T>(query).ToList<T>(); 

     return results; 
} 

回答

2

好的,所以我想通了 - 我如何傳遞一個lambda表達式來使用Azure表存儲。

我改變方法爲以下:

public List<T> GetSome<T>(Expression<Func<T, bool>> criteria) where T : ITableEntity, new() 
{       
    // table, in this case, is my `CloudTable` instance 
    List<T> results = table.CreateQuery<T>().Where(criteria).ToList(); 

    return results; 
} 

我現在可以通過在表達。例如,要搜索針對DynamicTableEntity,我可以使用:

// my table storage class 
TableStorage ts = new TableStorage("ContactData"); 

// search with expression 
List<DynamicTableEntity> results = ts.GetSome<DynamicTableEntity>(t => t.Properties["FirstName"].StringValue == "Darren"); 

如果這是你不會/不應該做針對Azure的錶店,請不要讓我知道。

與此同時,這是我滿足要求的方式。

1

的錯誤是因爲擴展方法Where返回的值是IQueryable<T>型的,但你分配給TableQuery<T>類型的變量並沒有隱含有效這些類型之間的類型轉換。

+1

我明白這一點。我掙扎的地方是我如何才能讓它工作。我想我正在使用錯誤的方法,但不知道我應該使用哪一個來傳遞lambda。 – Darren