使用表达式抽象出对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;
}
好的,所以我弄清楚了-我如何传递一个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>
类型的变量,并且这些类型之间没有隐式有效的类型转换。