使用表达式抽象出对Azure表存储的查询

本文关键字:存储 查询 Azure 表达式 抽象 | 更新日期: 2023-09-27 18:04:44

我正在创建一个类来使用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?)

我理解这个消息,知道它告诉我我错过了一个类型转换,尽管我不确定如何正确地编码它。

我的完整方法是:

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

使用表达式抽象出对Azure表存储的查询

好的,所以我弄清楚了-我如何传递一个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表存储做的事情,请让我知道。

同时,这是我如何满足要求的

该错误是因为扩展方法Where返回的值是IQueryable<T>类型,但您正在分配给TableQuery<T>类型的变量,并且这些类型之间没有隐式有效的类型转换。