C# Azure表存储范围查询,常用条件包装在方法中

C# Azure表存储范围查询,常用条件包装在方法中,c#,azure,azure-storage,azure-table-storage,C#,Azure,Azure Storage,Azure Table Storage,我的应用程序中经常出现这样的情况:我创建一个查询来获取所有实体,其中partitionkey是常量,但rowkey应该在词法范围内(例如,只有以某个前缀开头的行): //查询以获取分区“KnownPartition”中的所有实体,其中RowKey以“前缀”开头 CloudTableQuery查询= (来自tableServiceContext.CreateQuery(tableName)中的e) 其中e.PartitionKey==“KnownPartition” &&e.RowKey.Comp

我的应用程序中经常出现这样的情况:我创建一个查询来获取所有实体,其中partitionkey是常量,但rowkey应该在词法范围内(例如,只有以某个前缀开头的行):

//查询以获取分区“KnownPartition”中的所有实体,其中RowKey以“前缀”开头
CloudTableQuery查询=
(来自tableServiceContext.CreateQuery(tableName)中的e)
其中e.PartitionKey==“KnownPartition”
&&e.RowKey.CompareTo(“前缀”)大于0

&&e.RowKey.CompareTo(“Prefix`”)如果将条件分解为一个函数,那么该函数需要返回一个表达式树,而不是一个布尔值。我不知道LINQ查询语法是否支持此操作,但可以使用如下方法语法:

public static Expression<Func<MyEntity, bool>> HasPrefix(String prefix) 
{ 
    return e => e.RowKey.CompareTo(prefix + '_') > 0 && e.RowKey.CompareTo(prefix + '`') <= 0;
}

CloudTableQuery<MyEntity> query =
    (from e in tableServiceContext.CreateQuery<MyEntity>(tableName)
    where e.PartitionKey == "KnownPartition"
    select e)
    .Where(HasPrefix("Prefix"))
    .AsTableServiceQuery();
公共静态表达式HasPrefix(字符串前缀)
{ 

返回e=>e.RowKey.CompareTo(前缀+''''''>0&&e.RowKey.CompareTo(前缀+''`')这是Kevin答案的一个概括。它做了同样的事情,但适用于任何前缀字符串,而不仅仅是David在原始问题中询问的特定情况

public static Expression<Func<MyEntity, bool>> HasPrefix(String prefix) 
{ 
    char lastChar = prefix[prefix.Length - 1];
    char nextLastChar = (char)((int)lastChar + 1);
    string nextPrefix = prefix.Substring(0, prefix.Length - 1) + nextLastChar;

    return e => e.RowKey.CompareTo(prefix) >= 0 && e.RowKey.CompareTo(nextPrefix) < 0;
}
公共静态表达式HasPrefix(字符串前缀)
{ 
char lastChar=前缀[prefix.Length-1];
char nextLastChar=(char)((int)lastChar+1);
字符串nextPrefix=prefix.Substring(0,prefix.Length-1)+nextLastChar;
返回e=>e.RowKey.CompareTo(前缀)>=0&&e.RowKey.CompareTo(nextPrefix)<0;
}

非常酷,这很管用。谢谢。我想我们可以将整个表达式作为方法链来编写,而不是将linq查询语法编写为连续的。哦,顺便说一下,我希望这不会导致完全扫描…就像,从azure实际传输的实体已经检查了前缀条件,对吗?结果是Azu重新存储请求URI为:eq‘KnownPartition’)和(RowKey gt‘Prefix‘’)和(RowKey le‘Prefix%60’)。因此,只返回满足所有条件的行。此外,由于查询指定了分区键和一系列行键,因此后端也不需要进行完整的表扫描。感谢您提供一般化的答案!MS应该在linq查询处理器中包含此位!
public static Expression<Func<MyEntity, bool>> HasPrefix(String prefix) 
{ 
    return e => e.RowKey.CompareTo(prefix + '_') > 0 && e.RowKey.CompareTo(prefix + '`') <= 0;
}

CloudTableQuery<MyEntity> query =
    (from e in tableServiceContext.CreateQuery<MyEntity>(tableName)
    where e.PartitionKey == "KnownPartition"
    select e)
    .Where(HasPrefix("Prefix"))
    .AsTableServiceQuery();
public static Expression<Func<MyEntity, bool>> HasPrefix(String prefix) 
{ 
    char lastChar = prefix[prefix.Length - 1];
    char nextLastChar = (char)((int)lastChar + 1);
    string nextPrefix = prefix.Substring(0, prefix.Length - 1) + nextLastChar;

    return e => e.RowKey.CompareTo(prefix) >= 0 && e.RowKey.CompareTo(nextPrefix) < 0;
}