【问题标题】:Is there a way to use PredicateBuilder with Azure Table Storage?有没有办法将 PredicateBuilder 与 Azure 表存储一起使用?
【发布时间】: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 运行它?

【问题讨论】:

    标签: linq azure lambda expression predicatebuilder


    【解决方案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() 的使用 - 这是因为我在提供重复项时出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2016-11-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多