Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Azure表中选择随机记录_C#_Azure - Fatal编程技术网

C# 如何在Azure表中选择随机记录

C# 如何在Azure表中选择随机记录,c#,azure,C#,Azure,在Azure表中从输出列表中选择随机记录的有效方法是什么?下面的代码总是返回相同的记录。原因是什么 T entity = new T(); TableQuery<T> query = new TableQuery<T>(); var tableSet = table.ExecuteQuery(query).ToList(); if (tableSet.Count >= 1) { return tableSet.First(); } return nu

在Azure表中从输出列表中选择随机记录的有效方法是什么?下面的代码总是返回相同的记录。原因是什么

T entity = new T();

TableQuery<T> query = new TableQuery<T>();

var tableSet = table.ExecuteQuery(query).ToList();

if (tableSet.Count >= 1)
{
    return tableSet.First();
}

return null;
T实体=新的T();
TableQuery=新建TableQuery();
var tableSet=table.ExecuteQuery(query.ToList();
如果(表集计数>=1)
{
返回tableSet.First();
}
返回null;
下面的代码总是返回相同的记录。原因是什么

T entity = new T();

TableQuery<T> query = new TableQuery<T>();

var tableSet = table.ExecuteQuery(query).ToList();

if (tableSet.Count >= 1)
{
    return tableSet.First();
}

return null;
正如您所知,Azure表中的记录按字母顺序排序,首先按
PartitionKey
排序,然后按
RowKey
排序。因为您没有指定任何查询条件,所以表服务将开始从顶部(即第一个分区)获取数据。现在您要求表存储只返回一条记录,它将选择该分区中的第一条记录。这就是为什么你会得到同样的记录


如果要返回随机结果,必须指定一些查询参数。一种可能是随机指定PartitionKey值。如果表中存在PartitionKey,那么它将返回该分区中的第一条记录。

感谢您对这个问题的反馈。我找到了以下解决方案,从输出列表中提取一个随机记录

T entity = new T();

    TableQuery<T> query = new TableQuery<T>();

    var tableSet = table.ExecuteQuery(query).ToList();

    Random rnd = new Random();

    if (tableSet.Count >= 1)
    {
        return tableSet.ElementAt(rnd.Next(1, tableSet.Count));
    }

    return null;
T实体=新的T();
TableQuery=新建TableQuery();
var tableSet=table.ExecuteQuery(query.ToList();
随机rnd=新随机();
如果(表集计数>=1)
{
返回tableSet.ElementAt(rnd.Next(1,tableSet.Count));
}
返回null;

只需补充一点,范围查询速度很慢,尤其是在查询大型表时。分区键上的范围查询在性能上优于行键上的范围查询,当然也优于表属性上的范围查询(这实际上会导致全表扫描)。因此,如果要进行范围查询,则应改为使用PartitionKey。完全同意。@GauravMantri要获取随机记录,如果需要为
PartitionKey
指定一些值,如何从表中随机选择它?因为PartitionKey值可以是任何字符串值,这是您需要决定的,因为您知道代码是如何生成PartitionKey值的。举个例子,如果我们查看WAD**表中存储的诊断数据,我们知道PartitionKey值实际上以分钟精度表示日期/时间刻度(UTC)。所以在这种情况下,您可以随机选择一个日期/时间值,将其转换为记号并用于查询。@GauravMantri在我的例子中,这个
PartitionKey
是一个通过应用程序动态生成的GUID,例如
3bcbb4ae-3283-421f-897a-4354749aa27d
没有确切有效的方法从表存储中获取随机值。这种存储的工作原理类似于字典,它在提供密钥时返回结果的速度更快。因此,表存储是有效的,您应该提供一个PartitionKey和一个RowKey来以最有效的方式返回结果。这些称为点查询。其他查询是范围查询(在PK或RK上)或全表扫描查询,这对存储的数据量和遵循的分区策略的性能非常不利。这将检索所有记录并执行随机选择客户端。哎呀。