gpt4 book ai didi

linq - TableServiceContext和动态查询

转载 作者:行者123 更新时间:2023-12-02 08:10:50 24 4
gpt4 key购买 nike

我正在尝试做一些看起来很简单的事情,但当我想让它变得更加动态时,我遇到了巨大的困难。

    Expression<Func<TableServiceEntity, bool>> predicate = (e) => e.PartitionKey == "model" && (e.RowKey == "home" || e.RowKey == "shared");

context.CreateQuery<TableServiceEntity>(tableName).Where(predicate);

我想传递一个 rowKey 数组,而不必对谓词进行硬编码。

当我尝试构建表达式树时,我收到不支持的异常,我认为它不支持作为表达式树的一部分进行调用。

有人知道如何完全按照谓词构建和表达树以避免不支持的异常吗?

提前谢谢您

最佳答案

因此,您可以使用类似以下内容动态构建查询(取自 PhluffyFotos 示例):

        Expression<Func<PhotoTagRow, bool>> search = null;
foreach (var tag in tags)
{
var id = tag.Trim().ToLowerInvariant();

if (String.IsNullOrEmpty(id))
{
continue;
}

Expression<Func<PhotoTagRow, bool>> addendum = t => t.PartitionKey == id;

if (search == null)
{
search = addendum;
}
else
{
search = Expression.Lambda<Func<PhotoTagRow, bool>>(Expression.OrElse(search.Body, addendum.Body), search.Parameters);
}
}

现在,一旦您有了“搜索”,您就可以将其作为Where 子句中的谓词传递。

但是,我想说服你不要这样做。我正在回答你的问题,但告诉你做多个“|”是一个坏主意表存储中的 OR 子句。原因是至少在今天,这些查询无法优化,并且会导致全表扫描。对于任何不小的数据量,性能都将是可怕的。此外,如果您像这样动态构建谓词,您就会面临超出 URL 限制的风险(请记住这一点)。

PhluffyFotos 中的这段代码展示了如何操作,但这实际上是一个不好的做法(我知道,我写的)。它确实应该优化为单独并行运行每个 OR 子句。这才是你真正应该做的。 AND 子句没问题,但 OR 子句应该并行化(使用 PLINQ 或 TPL),并且您应该聚合结果。会快很多。

HTH。

关于linq - TableServiceContext和动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5976457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com