使用表达式将查询抽象到 Azure 表存储

Dar*_*ght 3 c# azure

我正在创建一个类来使用 Azure 表存储执行 CRUD 功能。

我在这使用泛型类型。

我有以下方法,我试图传入一个表达式以在 中使用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?)
Run Code Online (Sandbox Code Playgroud)

我理解这条消息并知道它告诉我我缺少演员表,但我不确定如何正确编码。

我的完整方法是:

 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;
 }
Run Code Online (Sandbox Code Playgroud)

Dar*_*ght 5

好的,所以我想通了 - 我如何传递 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;
 }
Run Code Online (Sandbox Code Playgroud)

我现在可以传入一个表达式。例如,要搜索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");
Run Code Online (Sandbox Code Playgroud)

如果这是您不会/不应该对 Azure 表格存储执行的操作,请告诉我。

同时,这就是我满足要求的方式。