有没有办法将 PredicateBuilder 与 Azure 表存储一起使用?

Posted

技术标签:

【中文标题】有没有办法将 PredicateBuilder 与 Azure 表存储一起使用?【英文标题】:Is there a way to use PredicateBuilder with Azure Table Storage? 【发布时间】:2013-11-08 19:25:57 【问题描述】:

正如它在锡上所说的那样,我有一个设计问题,通常 PredicateBuilder 是显而易见的答案,但是在执行时,我得到了如下错误:

The expression 
((([10007].PartitionKey == "df2907ad-2094-4b7a-9796-d077f14b25bc") 
And True) 
And Invoke(f => (True AndAlso Invoke(job => (job.MigrationExecutionId == "5fa0bd4c-4745-4452-8e52-a0329c00dafb"), f)), [10007])) 
is not supported.

有什么方法可以使用 Predicate builder 或其他形式的表达式树语法来构建查询并针对 Azure Table 运行它?

【问题讨论】:

【参考方案1】:

简短的回答:不。 ATS 仅提供有限的 linq 支持。

【讨论】:

您有相关文档的链接吗? 以下是 ATS 支持的所有内容:msdn.microsoft.com/en-us/library/windowsazure/dd135725.aspx 嘿,伊戈尔,连个问候都没有?!我知道 Azure 的语法有限,但我希望我可以通过表达式/谓词构建查询(在该语法的范围内),以便我可以更动态地构建查询。【参考方案2】:

是的,您可以将 PredicateBuilder 与 Azure 表存储一起使用。假设您要构建格式的查询(伪代码):

where partitionkey = "X" and (email = "Y" or email = "Z")

可以按如下方式进行

    public string[] GetByEmail(string companyId, string[] emails)
    
        var inner = PredicateBuilder.New<IssuerTableEntity>(false);
        foreach (var email in emails.Select(x => x.ToLowerInvariant()).Distinct())
        
            var temp = email;
            inner = inner.Or(x => x.EmailLowercase == temp);
        

        var outer = PredicateBuilder.New<MyTableEntity>(false);
        outer = outer.And(x => x.PartitionKey == companyId);
        outer = outer.And(inner);

        CloudTable table = GetTable(MyTableName);  
        return table.CreateQuery<MyTableEntity>()
            .Where(outer)
            .Select(x => x.RowKey)
            .ToArray();
    

注意Distinct() 的使用 - 这是因为我在提供重复项时出错。

【讨论】:

以上是关于有没有办法将 PredicateBuilder 与 Azure 表存储一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

将 LinqKit PredicateBuilder 用于相关模型(EF Core)

Entity Framework 4.1 Code First - 使用 LinqKit PredicateBuilder 时忽略包含

用PredicateBuilder实现Linq动态拼接查询

如何使用 PredicateBuilder、EF Core 5 和 Postgresql 10+ 执行不区分大小写和重音的 LIKE(子字符串)查询?

有没有办法将 postcss 与样式组件一起使用?

有没有办法将 QVariant 与 QVector 一起使用?